我有一个从线程AsyncTask 执行的。在onPreExecute()方法中,我想更改一些TextView,但是我得到了以下错误(recap):
05-07 11:53:02.039: E/AndroidRuntime(7062): FATAL EXCEPTION: processBarcodeThread
05-07 11:53:02.039: E/AndroidRuntime(7062): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
.....
05-07 11:53:02.039: E/AndroidRuntime(7062): at android.widget.TextView.setText(TextView.java:2573)
05-07 11:53:02.039: E/AndroidRuntime(7062): at it.mbm.droid.activity.fragment.LabelAnagFragment$ReadFromServerTask.onPreExecute(LabelAnagFragment.java:301)
05-07 11:53:02.039: E/AndroidRuntime(7062): at android.os.AsyncTask.execute(AsyncTask.java:391)这意味着onPreExecute()不是在UI线程上执行的,但是根据Android文档:
onPreExecute(),在执行任务之前在UI线程上调用。此步骤通常用于设置任务,例如,通过在用户界面中显示进度条。
那我在哪里做错了?
发布于 2013-05-07 11:02:37
您似乎是在从后台线程在execute()上调用AsyncTask。如果您阅读了AsyncTask的文档,您将看到这是不受支持的:
要使该类正常工作,必须遵循一些线程规则:
因此,请将代码更改为从主应用程序线程调用AsyncTask上的AsyncTask。
发布于 2013-05-07 10:30:24
尝试将更改放入onProgressUpdate方法中。类似于:
private class MyAsyncTask extends AsyncTask<Void, String, Void> {
@Override
protected Void doInBackground(Void... params) {
while (!isCancelled()) {
publishProgress("putThisStringToTextView");
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
updateTextView(values[0]);
}
private void updateTextView(String text) {
final Activity activity = getActivity();
final TextView myTextView = ((TextView) activity.findViewById(R.id.my_txt_view));
if (textView == null) {
return;
}
textView.setText(text);
this.cancel(true);
}
}发布于 2013-05-07 10:31:49
您可能在以下步骤中失败:
必须在UI线程上加载AsyncTask类。这是从Build.VERSION_CODES.JELLY_BEAN开始自动完成的。必须在UI线程上创建任务实例。
执行(java.lang.Object[])必须在UI线程上调用。
https://stackoverflow.com/questions/16416305
复制相似问题