【问题标题】:RunntimeException for doinbackground in Asynchronous Task异步任务中 doinbackground 的 RunntimeException
【发布时间】:2014-12-11 21:23:55
【问题描述】:

我正在开发一个应用程序来使用异步任务查看通话历史记录。当我在 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): 在 android.os.AsyncTask$3.done(AsyncTask.java:299) 12-11 18:34:57.892: E/AndroidRuntime(4744):在 java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 java.util.concurrent.FutureTask.setException(FutureTask.java:219) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 java.util.concurrent.FutureTask.run(FutureTask.java:239) 12-11 18:34:57.892:E/AndroidRuntime(4744):在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 12-11 18:34:57.892:E/AndroidRuntime(4744):在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 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): 在 android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5288) 12-11 18:34:57.892:E/AndroidRuntime(4744):在 android.view.ViewRootImpl.focusableViewAvailable(ViewRootImpl.java:2919) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:613) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 android.view.View.setFlags(View.java:8463) 12-11 18:34:57.892: E/AndroidRuntime(4744):在 android.view.View.setFocusableInTouchMode(View.java:5802) 12-11 18:34:57.892:E/AndroidRuntime(4744):在 android.widget.AdapterView.checkFocus(AdapterView.java:717) 12-11 18:34:57.892:E/AndroidRuntime(4744):在 android.widget.ListView.setAdapter(ListView.java:467) 12-11 18:34:57.892:E/AndroidRuntime(4744):在 com.example.testphonegap.DialledCallsFrag.GetList(DialledCallsFrag.java:42) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 com.example.testphonegap.DialledCallsFrag.setDialledCalls(DialledCallsFrag.java:35) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 com.example.testphonegap.CallHistoryValues$GetCallLogs.doInBackground(CallHistoryValues.java:118) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 com.example.testphonegap.CallHistoryValues$GetCallLogs.doInBackground(CallHistoryValues.java:1) 12-11 18:34:57.892: E/AndroidRuntime(4744): 在 android.os.AsyncTask$2.call(AsyncTask.java:287) 12-11 18:34:57.892: E/AndroidRuntime(4744):在 java.util.concurrent.FutureTask.run(FutureTask.java:234) 12-11 18:34:57.892: E/AndroidRuntime(4744): ... 4 更多

【问题讨论】:

  • 谢谢!....谁给了我早熟的时间来回答我的问题并给出了宝贵的答案..现在我解决了它

标签: android android-asynctask


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    下面一行很关键:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多