如何使用 Android 网络访问、线程和处理程序
How to use Android network access, threads and handlers
尝试编写我的第一个 Android 应用程序,我的出发点是让应用程序从我的网站读取文本文件,并将其显示在应用程序中。
我已授予应用程序网络访问权限,发现无法从主线程进行网络访问,但还发现单独的线程无法对 TextView 进行更改。试图实现处理程序,但一切都崩溃了。
我使用了一个由按钮触发的全局变量,这样主线程可以更新 TextView,但是当我将计时器添加到 运行 同一个线程时,TextView 变成空白或崩溃。
你能概述一下推荐的 steps/code 吗,因为我正在努力将所有组件放在一起以启动我吗?
更新:这是我放在一起的工作代码:
private class GetUpdate extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params){
try {
URL urlObj = new URL("https://webpage.com");
HttpsURLConnection urlConnection = (HttpsURLConnection) urlObj.openConnection();
urlConnection.setConnectTimeout(5000);
InputStream is = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String temp = br.readLine();
UpdateInfo = UpdateInfo + br.readLine();
}
catch (java.net.SocketTimeoutException e) {
UpdateInfo = UpdateInfo + "No Network";
}
catch (IOException e){
UpdateInfo = UpdateInfo + "Failed";
throw new RuntimeException(e);
}
return "";
}
protected void onPostExecute(String result) {
TextView StatusText = (TextView) findViewById(R.id.StatusText);
StatusText.setText(UpdateInfo);
}
@Override
protected void onPreExecute() {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
String currentDateandTime = sdf.format(new Date());
UpdateInfo = "Status -\n\r" + currentDateandTime + " - ";
}
@Override
protected void onProgressUpdate(Void... values) {}
}
定时器位于 onCreate 中:
Timer myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
new GetUpdate().execute("");
}
}, 0, 5000);
这是一个例子:-
在您的 oncreate 方法上执行此操作
txtMessage = (TextView) findViewById(R.id.txt_push_message);
new task().execute();
class task extends AsyncTask<String, String,String>{
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
txtMessage.setText("Hi there");
}
@Override
protected String doInBackground(String... params) {
//Do something related to get the data and return that
//Return the proper value
return null;
}
}
尝试编写我的第一个 Android 应用程序,我的出发点是让应用程序从我的网站读取文本文件,并将其显示在应用程序中。
我已授予应用程序网络访问权限,发现无法从主线程进行网络访问,但还发现单独的线程无法对 TextView 进行更改。试图实现处理程序,但一切都崩溃了。
我使用了一个由按钮触发的全局变量,这样主线程可以更新 TextView,但是当我将计时器添加到 运行 同一个线程时,TextView 变成空白或崩溃。
你能概述一下推荐的 steps/code 吗,因为我正在努力将所有组件放在一起以启动我吗?
更新:这是我放在一起的工作代码:
private class GetUpdate extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params){
try {
URL urlObj = new URL("https://webpage.com");
HttpsURLConnection urlConnection = (HttpsURLConnection) urlObj.openConnection();
urlConnection.setConnectTimeout(5000);
InputStream is = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String temp = br.readLine();
UpdateInfo = UpdateInfo + br.readLine();
}
catch (java.net.SocketTimeoutException e) {
UpdateInfo = UpdateInfo + "No Network";
}
catch (IOException e){
UpdateInfo = UpdateInfo + "Failed";
throw new RuntimeException(e);
}
return "";
}
protected void onPostExecute(String result) {
TextView StatusText = (TextView) findViewById(R.id.StatusText);
StatusText.setText(UpdateInfo);
}
@Override
protected void onPreExecute() {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
String currentDateandTime = sdf.format(new Date());
UpdateInfo = "Status -\n\r" + currentDateandTime + " - ";
}
@Override
protected void onProgressUpdate(Void... values) {}
}
定时器位于 onCreate 中:
Timer myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
new GetUpdate().execute("");
}
}, 0, 5000);
这是一个例子:-
在您的 oncreate 方法上执行此操作
txtMessage = (TextView) findViewById(R.id.txt_push_message);
new task().execute();
class task extends AsyncTask<String, String,String>{
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
txtMessage.setText("Hi there");
}
@Override
protected String doInBackground(String... params) {
//Do something related to get the data and return that
//Return the proper value
return null;
}
}