我在其中一个名为txtdownloadStatus的页面中有一个textview。我有一个下载一些数据的线程类,如果已经完成,我想在文本视图中显示已完成的文本视图,我告诉我们。
我的用户界面名称是
download_manifest.txtdownloadStatus.setText("Completed Download");
线程类如下所示
public class thread_download extends Thread {
private download_helper downloadhelper;
private Context context;
public thread_download(Context context) {
this.context = context;
}
public void run() {
downloadhelper = new download_helper(this.context);
try {
downloadhelper.DownloadProblemAndReasonCode();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
downloadhelper.DownloadNewManifest();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
downloadhelper.DownloadNewMessages();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
downloadhelper.DeleteOldManifest();
try {
download_manifest.txtdownloadStatus.setText("Cpmpleted");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
问题在于,当我尝试将值设置为线程类中的textview时。它显示如下所示的错误
android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。
有人会帮助我
答案 0 :(得分:1)
你必须在UIthread上运行它。因为错误说UI元素上的任何操作都必须在UIthread中执行。
您必须使用runOnUIThread()
方法。
使用AsyncTask
,它会自动为您创建一个单独的线程,并在UI线程上运行postExecute
和preExecute
方法。你不需要做任何复杂的事情,如果你使用asyncTask,它就是为了这个目的而设计的。
答案 1 :(得分:1)
您无法从UI线程以外的线程修改UI。您应该使用Handler,AsyncTask或runOnUiThread来修改用户界面。
答案 2 :(得分:0)
在android中,所有的UI内容都应该在UI线程上完成。您可以使用runOnUIThread方法,也可以在后台线程中完成处理后,使用处理程序更新textview。你的错误将被修复。