2017-04-19 112 views
0

doInBackground()工作正常.. Looper.loop()後的代碼將不起作用。在Looper.Loop()之後不執行打印並且不執行onPostExceute()。我需要等到方法1,2,3執行。如果不使用Looper.prepare(),則會在方法1中發生異常。Looper.loop()之後不執行onPostExecute()

@Override 
    protected Void doInBackground(Void... params) { 
     try { 

       if (Looper.myLooper() == null) 
        Looper.prepare();    
       method1(); 
       method2(); 
       method3(); 
       Looper.loop(); 

       Log.d(TAG,"after loop()"); 
      } else { 
       method4(); //inside asyn task 
      } 

      Log.d(TAG,"doInBackground end"); 

     }catch (Exception e) { 
      Log.d(TAG,"doInBackground exception "+e); 
     } 


     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     try { 


      Log.d(TAG, "onPostExecute"); 



      //............ 

     }catch (Exception e){ 
      Log.d(TAG,"onPostExecute end"); 
     } 
    } 


    @Override 
    protected void onPreExecute() { 
     //..... 
    } 

回答

2

Looper.loop使線程循環永遠等待消息隊列中的傳入事件並運行關聯的可運行程序。它永遠不應該在AsyncTask上調用,它會導致整個AsyncTask線程無限循環,將所有未來的AsyncTasks鎖死。只能在線程上調用它,並且只有在你明白如何使用它的時候。

+0

如果我沒有使用Looper.loop()和Looper.prepare(),是否會發生任何異常。如果我沒有使用Looper.prepare(),我會得到異常。 –

+0

如果您在不需要讀取消息隊列時未通過使用prepare來獲得異常,那麼您正在做其他事情。當你應該在UI線程上創建一個Handler時,可能會在AsyncTask上創建一個Handler。 –

相關問題