2

我有一个从线程执行的 AsyncTask 。在onPreExecute()方法中我想更改一些TextViews 但我得到以下错误(回顾):

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

那么,我在哪里做错了?

4

3 回答 3

6

您似乎是从后台线程调用execute()您的。AsyncTask如果您阅读 的文档AsyncTask,您会发现这是不受支持的:

要使此类正常工作,必须遵循一些线程规则:

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

因此,请更改您的代码以从主应用程序线程调用execute()您的代码。AsyncTask

于 2013-05-07T11:02:37.167 回答
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);
    }
}
于 2013-05-07T10:30:24.300 回答
0

您可能在以下步骤中失败:

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

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

于 2013-05-07T10:31:49.780 回答