我正在开发一个应用程序来使用异步任务查看调用历史记录。当我在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更多
答案 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()之后调用并在调用线程上运行。