首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:在UI线程中不执行AsyncTask onPreExecute()方法

Android:在UI线程中不执行AsyncTask onPreExecute()方法
EN

Stack Overflow用户
提问于 2013-05-07 10:02:55
回答 3查看 4.4K关注 0票数 2

我有一个从线程AsyncTask 执行的。在onPreExecute()方法中,我想更改一些TextView,但是我得到了以下错误(recap):

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

那我在哪里做错了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-07 11:02:37

您似乎是在从后台线程在execute()上调用AsyncTask。如果您阅读了AsyncTask的文档,您将看到这是不受支持的:

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

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

因此,请将代码更改为从主应用程序线程调用AsyncTask上的AsyncTask

票数 6
EN

Stack Overflow用户

发布于 2013-05-07 10:30:24

尝试将更改放入onProgressUpdate方法中。类似于:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-05-07 10:31:49

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16416305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档