2013-05-07 28 views
2

我有一个从线程执行的AsyncTask 。在onPreExecute()方法我想改变一些TextView秒,但我得到了以下错误(重述):Android:AsyncTask onPreExecute()方法不会在UI线程中执行

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线程上调用。此步骤通常用于设置任务,例如通过在用户界面中显示进度条。

那么,我在哪里做错了?

+0

PLZ也显示在预执行方法代码 – 2013-05-07 10:03:55

+0

哪里是代码? ... – 2013-05-07 10:04:04

+0

你是从doInBackground()引用它吗? – Blackbelt 2013-05-07 10:06:41

回答

5

您似乎从AsyncTask后台线程调用​​。如果你读了AsyncTask的文件,你会看到,这是不支持:

有一些线程规则必须遵循 这类正常工作:

  • 的的AsyncTask类必须在UI线程上加载。从JELLY_BEAN开始自动完成 。
  • 必须在UI线程上创建任务实例 。
  • execute(Params ...)必须在UI线程上调用。 ...

因此,请改变你的代码从主应用程序线程调用​​您AsyncTask

+0

好吧,从技术上讲它是一种支持。如果您从另一个AsyncTask的doInBackground执行AsyncTask,它不会引发错误。当onPostExecute被调用时,你不会在你期望的线程上。该文档是否为预防意外结果的警告?或者如果你不注意文档中的警告,是否还有其他线程问题? – 2013-09-04 17:35:53

+0

@ChristopherPerry:“当onPostExecute被调用时,你就不会在你期望的线程上” - 它肯定会崩溃。 – CommonsWare 2013-09-04 17:53:34

0

尝试将更改放入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); 
    } 
} 
0

你可能失败在这些步骤:

的的AsyncTask类必须在UI线程加载。这是从 Build.VERSION_CODES.JELLY_BEAN 自动完成的。 必须在UI线程上创建任务实例。

必须在UI线程上调用execute(java.lang.Object [])。

相关问题