2017-04-19 2 views
0

doInBackground()는 Looper.loop()이 작동하지 않으면 잘 동작합니다. Looper.Loop() 후에는 인쇄하지 않고 onPostExceute()는 실행하지 않습니다. 방법 1,2,3가 실행될 때까지 기다려야합니다. Looper.prepare()가 사용되지 않으면 method1에서 예외가 발생합니다.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

메시지 대기열을 읽을 필요가 없을 때 준비를 사용하지 않음으로써 예외가 발생하는 경우 잘못된 다른 작업을 수행하고 있습니다. UI 스레드에서해야 할 때 AsyncTask에서 Handler를 만드는 것 같습니다. –