AsyncTask有时会在doInBackround中崩溃我的应用程序(ViewRoot $ CalledFromWrongThreadException)

时间:2012-06-20 09:51:31

标签: android android-asynctask

有人可以告诉我为什么我的Async任务有时会失败吗? 我在3台设备上测试了它,但这个错误从未发生过。 我上传到GooglePlay,在 200次下载之后有 3次错误报告,我还不知道该错误的主要来源是什么......

java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:200)
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
    at java.lang.Thread.run(Thread.java:1019)
    Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    at android.view.ViewRoot.checkThread(ViewRoot.java:3225)
    at android.view.ViewRoot.invalidateChild(ViewRoot.java:760)
    at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:786)
    at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
    at android.view.View.invalidate(View.java:5498)
    at android.view.View.setBackgroundDrawable(View.java:7845)
    at android.view.View.setBackgroundResource(View.java:7754)
    at com.KeySoft.NewPilates.Activities.LatestActivity.parseXml(LatestActivity.java:1106)
    at com.KeySoft.NewPilates.Activities.LatestActivity.access$1(LatestActivity.java:964)
    at com.KeySoft.NewPilates.Activities.LatestActivity$DownloadXml.doInBackground(LatestActivity.java:354)
    at com.KeySoft.NewPilates.Activities.LatestActivity$DownloadXml.doInBackground(LatestActivity.java:1)
    at android.os.AsyncTask$2.call(AsyncTask.java:185)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)

我看到我的 AsyncTaks的 * doInBackground *函数有一个 setBackgroundDrawable setBacktroundResource func可以执行某些操作不好意思......任何想法?

E D I T:

从已检查答案中获得解决方案:

我必须使用新的Runnable来修改doInBackround中的视图。

runOnUiThread(new Runnable() {
             public void run() {

                 LinearLayout hatterLayout = (LinearLayout)findViewById(R.id.hatterLayout);
                hatterLayout.setBackgroundResource(R.drawable.nonet);

            }

2 个答案:

答案 0 :(得分:3)

您正在尝试在后台线程上执行与UI相关的工作(操作View)。 setBackgroundDrawable()setBackgroundResource()View类的方法,而不是ASyncTask

你不能这样做。在一般情况下,请查看runOnUiThread()作为从后台线程发起UI更新的方法。

但是对于ASyncTask具体来说,你已经有了方便的钩子来在UI线程上做东西了。您应该考虑覆盖onProgressUpdate()onPostExecute(),并在那里进行用户界面工作。

答案 1 :(得分:1)

你必须在UIThread上执行setBackgroundDrawable。

所以在asynctask的onPostExecute方法中执行setBackgroundDrawable。