尝试编写我的第一个Android应用程序,我的出发点是让应用程序从我的网站读取文本文件,并将其显示在应用程序中。
我给了应用程序网络访问权限,发现无法从主线程进行网络访问,但是也发现单独的线程无法对TextViews进行更改。试图实施Handler,一切都崩溃了。我使用了一个由按钮触发的全局变量,因此主线程可以更新TextView,但是当我在混合中添加一个计时器来运行相同的线程时,TextView会出现空白或崩溃。
您是否可以概述推荐的步骤/代码,因为我正在努力将所有组件放在一起让我开始?
更新:这是我放在一起的工作代码:
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);
答案 0 :(得分:1)
这是一个例子: -
在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;
}
}