【发布时间】:2017-08-18 11:34:01
【问题描述】:
尝试编写我的第一个 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:
Timer myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
new GetUpdate().execute("");
}
}, 0, 5000);
【问题讨论】:
-
正确指定错误
-
Android 文档和有关 Android 开发的书籍中回答了此类问题。请先通过它们
-
@Sonesh 看你不能在主线程上做网络东西所以我建议你去执行异步任务然后从异步任务设置你的文本视图
-
处理程序对你来说可能是低级的。从AsyncTask 开始 - 研究文档并尝试使用它。
-
在过去的几天里,我已经清理了很多代码并用其他代码替换了,但是我已经大量破坏了我的代码,我已经废弃它重新开始了。我通常是一名 VB 程序员,我发现 Java 使用单独的强制线程要复杂得多。主要错误是我找到了有关线程、网络访问和 setText 的信息,但没有找到真正将它们放在一起的信息
标签: android multithreading network-programming handler