2013-07-03 47 views
1

標題說明了一切。主要是。這隻發生在1臺設備上。其他設備都很好。在UIThread上運行併發布查看,仍然得到CalledFromWrongThreadException

AsyncTaskonPostExecute我打電話下面的代碼,收到這個異常之前我沒有足夠的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); 
     } 

    } 
+1

'在一個AsyncTask的onPostExecute我打電話下面的代碼'?不需要在onPostExecute中使用runOnUiThread,因爲onPostExecute總是在主UI線程上運行。所以只需調用'lvUpdatesList.setAdapter(updateListAdapter);'在onPostExecute中用數據 –

+0

填充適配器onPostExecute已經在拋出異常。我添加了runOnUiThread,因爲onPostExecute拋出了異常,並且拋出它,帶或不帶runOnUiThread。你從一開始就暗示自己在做什麼,並且在除了這個HTC Nexus One 2.3.3之外的所有設備上工作正常。 – WIllJBD

+0

可能的問題在於代碼的其他部分,因此顯示完整的'AsyncGetUpdates'類代碼以獲得更多幫助我們 –

回答

2

因爲如果人有這樣的問題,您可以在任何崗位豆形軟糖設備慣於未來,你這是怎麼解決它。

你在應用程序中做的第一件事就是這個。

@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應用涉及爲你,你的應用程序是否使用了正確的Looper/UIThread的InternalHandler

相關問題