2016-04-21 62 views
0

我有實現的的AsyncTask如下:「活動A」的的AsyncTask不執行,如果我重新打開「活動A」之前的原始的AsyncTask完成執行

AsyncTask asyncTask = new AsyncTask() { 
       @Override 
       protected Object doInBackground(Object[] params) { 
        //downloading images from google places api 
       } 

       @Override 
       protected void onPostExecute(Object o) { 

        } 
       } 
      }; 
      asyncTask.execute(); 

此的AsyncTask被觸發運行多次,並由另一個AsyncTask的doInBackground()方法的作用域執行。它運行良好第一次我打開一個活動,如果我讓所有的數據下載,然後退出活動(這樣的onStop()被調用),並重新打開它也運行得很好,那麼,活性,如果我在下載所有數據之前退出活動,但在重新打開活動時不會運行。

有誰知道這是爲什麼?任何人都可以推薦一個更好的方法,不涉及AsynTask?

注:我嘗試過使用executeOnExecutor(),但它沒有解決問題。

在此先感謝

+0

你在哪個方法開始任務?另外,你如何離開並重新進入活動? –

+0

我在另一個任務的doInBackground()方法中調用的方法中啓動任務。我離開並重新進入活動的原因是模擬用戶在應用程序中的不同屏幕上迭代 –

+0

在哪種方法中,您正在開始第一個任務? –

回答

0

AsyncTasks在單個線程中運行,在收到訂單。如果您在AsyncTask完成之前退出,它將繼續運行。如果在完成之前重新啓動它,它會在任務隊列中等待,直到原始運行完成,然後才能運行。你可以通過讓它在自己的隊列上運行來避免它。儘管一個更好的方法可能是一個Loader,如果它無論如何將獲取相同的數據(這將允許它不能再次運行但使用第一次運行的結果)。

+0

感謝您的回覆,並對我的延遲迴復感到抱歉。加載器的建議並不適合我的情況,因爲每次創建活動時我都在尋找新的數據。麻煩的是,通過啓動的Activity觸發的待定AsyncTasks並未在任務隊列中等待,直到原始AsyncTasks完成,或者至少看起來沒有,因爲不管活動剩餘的時間多長,它們從未執行過。如果通過運行它自己的隊列,你的意思是使用executeOnExecutor()的一個版本,我已經嘗試過,但它沒有奏效。這是你的建議嗎? –