2016-12-13 109 views
0

是否有可能由於某種原因,android操作系統可能會延遲或暫停我的asynctask。如果是這樣,我可以做些什麼來確保我的任務(例如從數據庫獲取數據)不會延遲或暫停。可能在UI線程上運行它,但我已經讀過它並不是一個好主意,因爲它可能會凍結UI並導致延遲。android可以延遲或暫停我的異步任務嗎?

+0

它在什麼情況下延遲或暫停您的任務? – Victory

+0

我正在從數據庫獲取數據並填充列表視圖。我使用異步任務獲取數據,並在異步任務完成後將其存儲在數組列表中。我在onPostExecute()函數中調用notifyDataSetChanged()以更新列表視圖適配器。大多數時候列表加載正常,但有時會出現延遲(我看到空白屏幕),並在一段時間後listview被更新。 –

+1

你怎麼確定它不只是花更長的時間從數據庫獲取然後預期?磁盤io可能會很慢。 – Victory

回答

2

是否有可能在Android操作系統可能會延遲或暫停我的AsyncTask出於某種原因。

它可能被另一個AsyncTask實例阻塞。默認情況下,他們在一個單一的後臺線程運行:https://developer.android.com/reference/android/os/AsyncTask.html

如果是的話我能做些什麼,以確保我的任務(如讀取數據庫數據)不被延遲或暫停。

調查究竟導致延遲。它是doInBackground方法中的內容還是延遲發生在後臺操作之前或之後。它可以是任何東西,很難說,沒有調試代碼。

在UI線程上運行它可能但我已經讀過它不是一個好主意,因爲它可以凍結UI並導致滯後。

儘管在這種情況下AsyncTask不是一個好的解決方案,但如果您正確實施它,它應該可以正常工作。其他要考慮的方法是Loader s或AsyncQueryHandlerContentProvider。取決於你的用例。

+0

U不完全正確,AsyncTask使用threadPoolExecutor來運行操作,而簡單的LinkedBlockingQueue來存儲任務,絕對最小值爲2個線程,最大爲處理器數量的兩倍(2 * C + 1),線程以「AsyncTask#」命名,並且在AsyncTask完成後不會終止,而是等待下一個任務。 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java#L208 – Inverce

+0

感謝您的信息。根據你的鏈接,有一行:private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR; 。 'AsyncTask' *可以使用threadPoolExecutor,但默認行爲是串行的。 –

+0

@Inverce'從HONEYCOMB開始,任務在單個線程上執行,以避免由於並行執行導致的常見應用程序錯誤。'Link [here](https://developer.android.com/reference/android/os/AsyncTask.html )。 – Enzokie

0

@Override protected void onPreExecute(){ holdWait = false; stop = false; }

@Override 
    protected Void doInBackground(Void... params) { 
     synchronized (this) { 
      while(true) { 
       if(Work) return null; 
       if(HaveWork) { 
        //make some 
       } else { 
        try { 
         wait(); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
     return null; 
    } 

    public void mynotify() { 
     synchronized (this) { 
      if(holdWait) { 
       notify(); 
       holdWait = false; 
      } 
     } 
    } 

    public void setStopWork() { 
     synchronized (this) { 
      stop= false; 
      if(holdWait) { 
       notify(); 
       holdWait = false; 
      } 
     } 
    } 
} 
+0

我想你不明白我的問題。我沒有對asynctask進行任何參考,並且再次運行它,並且開始了。當我的應用程序啓動時,我只運行asyctask從數據庫獲取數據。 –

+0

@DayemSiddiqui @DayemSiddiqui我已更新代碼請檢查 – user1782565

+0

@DayemSiddiqui可能會幫助你 – user1782565