2013-11-27 19 views
0

我正在製作應用程序,當歌曲開始播放時向Web服務器發送更新...我通過asynctask執行Web服務器更新,但有時會跳過一些信息,信息反覆發送。在某些情況下,asyntask保持運行狀態,使之後不執行。主線程運行良好。爲的AsyncTaskAsyncTask在線程中被重複呼叫時無法正常工作

我宣佈這樣的實例在MainActivity

private static AsyncTask<Void, Void, Void> mTask = null; 

代碼爲

private class SendingData extends AsyncTask<Void,Void,Void>{ 

     @Override 
     protected void onPreExecute(){ 
      //some task    
     }   
     protected void onPostExecute(Void params){ 
      Log.d("Tesing","After Post"); 
      super.onPostExecute(params);   
      } 
     @Override 
     protected Void doInBackground(Void... arg0) { 
      sendPost(); 
      return null; 
     } 

    } 

我呼籲的AsyncTask時在主線程一首新歌的變化。這是一個重複呼叫

if(mTask.getStatus() == AsyncTask.Status.FINISHED){ 
        // My AsyncTask is done and onPostExecute was called 
        Log.d("AsyncTask Status","Finished"); 
        mTask = new SendingData(); 
        mTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); 

       }else if(mTask.getStatus() == AsyncTask.Status.PENDING){ 
        Log.d("AsyncTask Status","Pending"); 
        try { 
        Thread.sleep(10000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
        mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
       } 

回答

3

你宣佈你AsyncTask爲靜態變量。這意味着您的引用會混淆,即當您開始一個新的AsyncTask時,您將覆蓋以前的引用。

+0

每次遇到或不得不打電話給asynctask時,我應該做一個新的參考嗎?我將如何檢查以前稱爲asynctask的狀態,或者我只是調用一個新的沒有考慮前面的像下面 新的SendingData()。executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); – Saty

+0

這是一個更好的重複任務AsyncTask.SERIAL_EXECUTOR或AsyncTask.THREAD_POOL_EXECUTOR?請解釋我。 – Saty