use*_*805 2 android thread-safety android-asynctask
我有一个从线程执行的AsyncTask .在onPreExecute()方法中我想改变一些TextView但我得到以下错误(回顾):
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)
Run Code Online (Sandbox Code Playgroud)
这意味着onPreExecute()不会在UI线程上执行,但根据Android文档:
onPreExecute(),在执行任务之前在UI线程上调用.此步骤通常用于设置任务,例如通过在用户界面中显示进度条.
那么,我在哪里做错了?
您似乎是从后台线程调用execute()您的AsyncTask.如果您阅读了相关文档AsyncTask,您将看到不支持此文档:
此类必须遵循一些线程规则才能正常工作:
- 必须在UI线程上加载AsyncTask类.这是从JELLY_BEAN开始自动完成的.
- 必须在UI线程上创建任务实例.
- 必须在UI线程上调用execute(Params ...)....
因此,请改变你的代码来调用execute()你的AsyncTask主应用程序线程.