异步任务中doinbackground的RunntimeException

时间:2014-12-11 13:15:34

标签: android android-asynctask

我正在开发一个应用程序来使用异步任务查看调用历史记录。当我在Jeally Bean(4.2.2)中运行我的应用程序时,它工作正常但在Kitkat(4.4.1)中它显示如下错误。 请帮我解决这个错误。提前致谢

  

12-11 18:34:57.892:E / AndroidRuntime(4744):致命异常:AsyncTask

     

1 12-11 18:34:57.892:E / AndroidRuntime(4744):java.lang.RuntimeException:执行时出错

     

doInBackground()12-11 18:34:57.892:E / AndroidRuntime(4744):at   android.os.AsyncTask $ 3.done(AsyncTask.java:299)12-11 18:34:57.892:   E / AndroidRuntime(4744):at   java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   java.util.concurrent.FutureTask.setException(FutureTask.java:219)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   java.util.concurrent.FutureTask.run(FutureTask.java:239)12-11   18:34:57.892:E / AndroidRuntime(4744):at   android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)12-11   18:34:57.892:E / AndroidRuntime(4744):at   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:573)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   java.lang.Thread.run(Thread.java:838)12-11 18:34:57.892:   E / AndroidRuntime(4744):引起:   android.view.ViewRootImpl $ CalledFromWrongThreadException:只有   创建视图层次结构的原始线程可以触及其视图。   12-11 18:34:57.892:E / AndroidRuntime(4744):at   android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5288)12-11   18:34:57.892:E / AndroidRuntime(4744):at   android.view.ViewRootImpl.focusableViewAvailable(ViewRootImpl.java:2919)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   android.view.View.setFlags(View.java:8463)12-11 18:34:57.892:   E / AndroidRuntime(4744):at   android.view.View.setFocusableInTouchMode(View.java:5802)12-11   18:34:57.892:E / AndroidRuntime(4744):at   android.widget.AdapterView.checkFocus(AdapterView.java:717)12-11   18:34:57.892:E / AndroidRuntime(4744):at   android.widget.ListView.setAdapter(ListView.java:467)12-11   18:34:57.892:E / AndroidRuntime(4744):at   com.example.testphonegap.DialledCallsFrag.GetList(DialledCallsFrag.java:42)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   com.example.testphonegap.DialledCallsFrag.setDialledCalls(DialledCallsFrag.java:35)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   com.example.testphonegap.CallHistoryValues $ GetCallLogs.doInBackground(CallHistoryValues.java:118)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   com.example.testphonegap.CallHistoryValues $ GetCallLogs.doInBackground(CallHistoryValues.java:1)   12-11 18:34:57.892:E / AndroidRuntime(4744):at   android.os.AsyncTask $ 2.call(AsyncTask.java:287)12-11 18:34:57.892:   E / AndroidRuntime(4744):at   java.util.concurrent.FutureTask.run(FutureTask.java:234)12-11   18:34:57.892:E / AndroidRuntime(4744):... 4更多

3 个答案:

答案 0 :(得分:0)

以下内容至关重要:

Only the original thread that created a view hierarchy can touch its views. 

您是否在AsyncTask中执行任何影响Activity或Fragment中View对象的操作?是这样,只在onProgress()onPostExecute()中执行,因为在UI线程上调用了这两个方法。

答案 1 :(得分:0)

只有创建视图层次结构的原始线程可以触及其视图 意味着您在doInBackground()方法中执行一些与UI相关的操作,因为doInBackground( )id在单独的非UI线程上运行。 Android不允许您在那里执行UI操作。

答案 2 :(得分:0)

您正在从AsyncTask方法doInBackground(...)访问View。此方法始终在与调用线程分开的新线程上运行。

如果您在Activity中启动AsyncTask,可以按如下方式调用View:

MyActivity.this.runOnUiThread(new Runnable() {
            public void run()
            {
                //access view here
            }
        });

但最好的解决方案是访问AsyncTask的onPostExecute()中的View,它将在doInBackground()之后调用并在调用线程上运行。