標題說明了一切。主要是。這隻發生在1臺設備上。其他設備都很好。在UIThread上運行併發布查看,仍然得到CalledFromWrongThreadException
在AsyncTask
的onPostExecute
我打電話下面的代碼,收到這個異常之前我沒有足夠的runOnUiThread
,添加了可運行的,因爲我得到了CalledFromWrongThreadException例外。
編輯
這是我發現。在某些情況下,應用程序可以有多個「looper」,因此可以有多個「UI線程」。
由於應用程序可以有多個「UI線程」,並且AsyncTask總是「在UI線程上運行」[ref],所以有人決定[而不是] AsyncTask總是在其創建線程上運行病例99.999999%將是正確的「UI線程」),他們決定用騙人把戲(或製作不良的快捷鍵,您決定)對「主尺蠖」執行..
Android: got CalledFromWrongThreadException in onPostExecute() - How could it be?
所以似乎現在我需要找到一種方法來確保異步任務線程始終是應用程序所在的循環線程:(
getParentActivity().runOnUiThread(new Runnable()
{
@Override
public void run()
{
setAdapterData(result);
}
});
什麼時候沒有工作我也試過這個,並且一起試了一下。
lvUpdatesList.post(new Runnable()
{
@Override
public void run()
{
lvUpdatesList.setAdapter(updateListAdapter);
}
});
我爲什麼表現得像這樣超級困惑。
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)
充分的AsyncTask
class AsyncGetUpdates extends AsyncTask<Void, Void, List<UpdateDTO>>
{
String userId;
@Override
protected void onPreExecute()
{
showDialog();
userId = getParentActivity().getCurrentUser().getUser_id();
super.onPreExecute();
}
@Override
protected List<UpdateDTO> doInBackground(Void... params)
{
boolean followingOnly = false;
if (myState == MyState.Following)
followingOnly = true;
return APIHelper.getUpdates(userId, followingOnly, count);
}
@Override
protected void onPostExecute(final List<UpdateDTO> result)
{
killDialog();
isCurrentlyUpdating = false;
getParentActivity().runOnUiThread(new Runnable()
{
@Override
public void run()
{
setAdapterData(result);
}
});
super.onPostExecute(result);
}
}
'在一個AsyncTask的onPostExecute我打電話下面的代碼'?不需要在onPostExecute中使用runOnUiThread,因爲onPostExecute總是在主UI線程上運行。所以只需調用'lvUpdatesList.setAdapter(updateListAdapter);'在onPostExecute中用數據 –
填充適配器onPostExecute已經在拋出異常。我添加了runOnUiThread,因爲onPostExecute拋出了異常,並且拋出它,帶或不帶runOnUiThread。你從一開始就暗示自己在做什麼,並且在除了這個HTC Nexus One 2.3.3之外的所有設備上工作正常。 – WIllJBD
可能的問題在於代碼的其他部分,因此顯示完整的'AsyncGetUpdates'類代碼以獲得更多幫助我們 –