我有一个TextView的布局说 mainTextView 。
我的活动文件类似于:
public class SecondActivity extends AppCompatActivity {
private static Integer i = 0;
private TextView tv = null;
@override
public void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
tv = (TextView) findViewById(R.id.mainTextView);
new MyThread().execute();
}
private void notifyAChange () {
tv.setText(i.toString());
}
private class MyThread extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground (String... params) {
while (true) {
try {
i++;
Thread.sleep(1000);
notifyAChange();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
这会在运行时返回 FATAL EXCEPTION 。我知道我不能触摸另一个线程的视图,除了原始视图,但是在那种情况下,我从主线程触摸视图,那么出了什么问题?
答案 0 :(得分:1)
不,你在doInBackground
(工作人员)的AsyncTask
部分
您正在调用notifyAChange()
表单工作线程,而不是主UI线程
您应该从onPostExecute
更新用户界面。或者您也可以使用runOnUiThread
来更新视图。
答案 1 :(得分:0)
主要使用asyncktask来执行长时间运行的任务所以有三种方法preExecute设置进度条,用于启动执行任务,doinbackground执行任务,如下载数据(主线程),后执行执行任务完成任务 您只能在使用asynctask时从Post执行更改UI组件。 有关asynktask的更多信息,请参阅https://developer.android.com/reference/android/os/AsyncTask.html 有关实施和说明,请参阅AsynkTask Implementation Update UI from Thread 你也可以使用RunonUI therad方法和Handler