标题说明了一切。好吧,大多数这只发生在1台设备上。其他设备都很好。
在onPostExecute
的{{1}}我调用下面的代码,在获得此异常之前我没有AsyncTask
,添加了runnable因为我收到了CalledFromWrongThreadException异常。
修改
这是我发现的。在某些情况下,应用程序可以有多个“looper”,因此可以有多个“UI线程”。
由于应用程序可以有多个“UI线程”而AsyncTask总是“在UI线程上运行”[参考],有人决定[不好]而不是AsyncTask总是在其创建线程上运行(在99.999999中)百分比的案例将是正确的“UI线程”)他们决定使用hocus pocus(或者你决定制作一个制作精良的快捷方式)来执行“主要的循环器”..
Android: got CalledFromWrongThreadException in onPostExecute() - How could it be?
所以现在看来我需要找到一种方法来确保异步任务线程始终是应用程序所处的looper线程:(
runOnUiThread
当它不起作用的时候我也试过了,并一起尝试了。
getParentActivity().runOnUiThread(new Runnable()
{
@Override
public void run()
{
setAdapterData(result);
}
});
我非常困惑为什么它表现得像这样。
lvUpdatesList.post(new Runnable()
{
@Override
public void run()
{
lvUpdatesList.setAdapter(updateListAdapter);
}
});
完整的asynctask
07-03 13:19:51.908: E/AndroidRuntime(4479): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.view.ViewRoot.invalidateChild(ViewRoot.java:642)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.view.View.invalidate(View.java:5279)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.widget.AbsListView.resetList(AbsListView.java:1120)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.widget.ListView.resetList(ListView.java:511)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.widget.ListView.setAdapter(ListView.java:440)
07-03 13:19:51.908: E/AndroidRuntime(4479): at com.********.********.FragmentUpdates.setAdapterData(FragmentUpdates.java:213)
07-03 13:19:51.908: E/AndroidRuntime(4479): at com.********.********.FragmentUpdates$AsyncGetUpdates.onPostExecute(FragmentUpdates.java:185)
07-03 13:19:51.908: E/AndroidRuntime(4479): at com.********.********.FragmentUpdates$AsyncGetUpdates.onPostExecute(FragmentUpdates.java:1)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.AsyncTask.finish(AsyncTask.java:417)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.AsyncTask.access$300(AsyncTask.java:127)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.Handler.dispatchMessage(Handler.java:99)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.Looper.loop(Looper.java:130)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.HandlerThread.run(HandlerThread.java:60)
答案 0 :(得分:2)
对于未来如果人们有这个问题,你不会在任何后期JellyBean设备中,这就是你如何解决它。
你在应用程序中做的第一件事就是这个。
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_splash);
this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
new AsyncInitLooperTask().execute();
}
});
}
public class AsyncInitLooperTask extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... params)
{
return null;
}
}
这样做会将处理您应用的AsyncTasks的InternalHandler
附加到您的应用正在使用的正确的Looper / UIThread。