2016-06-10 40 views
-1

在我的應用程序中,有多個asynctasks。請讓我知道爲什麼doInBackground的asynctask 有時沒有被調用。它的onPreExecute方法被調用。是否有任何問題,因爲多個asynctasks或其他?doInBackground有時不會被調用Android

/* ASync class for test table */ 
    public class TestAsynch extends AsyncTask<String, Void, String>{ 
     protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     String status = null; 
     String result1=API_Manager.getInstance().sendTestData(userName); 
     try { 
      if(result1 != null) { 
      // save in db 
      } 
     } 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
      } 
     return status; 
    } 
    @Override 
    protected void onPostExecute(String status) { 
    } 
} 
+0

哪裏是你的代碼的例子嗎? –

+0

請檢查驗證碼。 –

回答

0

OnPreExecute()在UI線程上被調用,doInBackground()在後臺線程上被調用。

異步任務有一個專用後臺線程。如果需要,可以更改此行爲。

http://android-er.blogspot.in/2014/04/run-multi-asynctask-as-same-time.html

現在,假設你有異步任務的多個實例,我假設你調用execute()運行異步任務。這將會立即觸發所有的preExecute,因爲UI線程是免費的,但是對於doInBackground它會一個接一個地觸發。因此,下一個異步任務可能需要一些時間才能啓動。

0

doInBackground應該在執行之前使用布爾值在循環上運行。在執行任務之前,設置一個全局布爾值(可能爲true/false)取決於你喜歡哪個,線程上的值應該調用runOnUiThread。

startExect = true; 
new TestAsynch().execute(); 

然後改變這種

public class TestAsynch extends AsyncTask<String, Void, String>{ 
    protected void onPreExecute() { 
    super.onPreExecute(); 
} 

@Override 
protected String doInBackground(String... params) { 
    String status = null; 
    String result1=API_Manager.getInstance().sendTestData(userName); 
    try { 
     if(result1 != null) { 
     // save in db 
     } 
    } 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
     } 
    return status; 
} 
@Override 
protected void onPostExecute(String status) { 
} 
} 

這個

public class TestAsynch extends AsyncTask<String, Void, String> { 

    String result1 = null; 

    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     String status = null; 
     result1=API_Manager.getInstance().sendTestData(userName); 

     while (startExecute) { 
      Thread exe = new Thread(new Runnable() { 
       @Override 
       public void run() { 

        try { 
         Thread.sleep(5); 
        } 
        catch(Exception e) { 
         e.printStackTrace(); 
        } 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          if(result1 != null) { 
           // save in db 
          } 
         } 
        }); 

       } 
      }); exe.start(); 

     } 

     return status; 
    } 

    @Override 
    protected void onPostExecute(String status) { 
    } 
} 
1

如果您的項目有多個asynctasks你必須檢查是否有可以執行asynctasks的限制。當你創建一個新的AsyncTask時,它將被添加到一個池中,並且只有在可能時纔會執行。 檢查這個答案: Multitasking on android 和文檔:ThreadPoolExecutor

這裏是一個如何正確地處理多個AsyncTasks AsyncTaskManager

+0

真的很有幫助。你能給我舉一個例子說明我如何實現這一點,意味着我可以限制呼叫asynctasks。 –

+0

如果你真的需要太多的AsyncTaks,那麼你需要改變池大小。這裏是一個例子:[AsyncTaskManager](https://developer.android.com/training/multiple-threads/create-threadpool.html?hl=pt-br) – ikkarion

相關問題