2014-02-28 15 views
0

現在我有一個定時器在Fragment s onCreate方法(定時間隔1分鐘)啓動AsyncTask。所以這不是一個好主意,我相信因爲如果有配置更改片段將再次調用onCreate方法,我會有2運行Timer AsyncTasks對嗎?哪裏把AsyncTask,以便它只能啓動一次

所以我需要一些方法將AsyncTask放置在應用程序的整個生命週期中僅啓動一次的地方。

回答

0

您可以使用Countdown Timer並在onDestroy()中將其取消。這可以保證你只有一個在任何時間運行。

至於剛剛開始它只有一次,你將不得不堅持知識的地方取決於您的需求。也許在onSaveInstanceState中存儲一個布爾值並在onCreate()中讀取它會行嗎?

而且,正如@marcin_j指出,AsyncTasks按順序(除非特別啓動不同)執行的,因此,使用一個將阻止在你的應用程序的每個其他異步任務(比如下載的東西等)。

+0

可能的簡單的方法是檢查'savedInstanceState'是否爲'null',那麼這意味着它是第一次創建'Fragment',所以我在那裏啓動AsyncTask? –

+0

布爾方法是更好的方法,它也是未來的證明。我不確定'savedInstanceState'在後續啓動中是否保證不爲空,特別是如果您從不保存任何內容。 – meredrica

0

如果有配置更改活動被破壞並重新創建所以沒有你不會有2個定時器運行

+0

但AsyncTask正在單獨的線程中運行。我認爲即使活動被破壞,AsyncTask線程也會繼續運行。 –

+0

活動將被銷燬,但片段可能在具有'saveInstanceState'設置或類似時不被銷燬。 – meredrica

+0

@PeterWarbo你是對的,AsyncTask仍然可以運行,即使在配置更改期間碎片已經損壞了。 – marcinj

4

沒有簡單的計時器需要的AsyncTask的,試試這個 -

class MyFragment extends Fragment{ 
private int currentTime; 
private void startTimer(){ 
    new Handler(). 
       postDelayed(new Runnable(){ 
         @Override 
         public void run() 
         { 
         onTick(); 
         startTimer(); 
         } 
        },1000*60); 
} 
private void onTick() 
{ 
    currentTime++; 
} 
@Override 
public void onSaveInstanceState(Bundle outState) 
{ 
     outState.putInt("currentTime", currentTime); 
    super.onSaveInstanceState(outState); 
} 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
super.onCreate(savedInstanceState); 
    if (savedInstanceState != null) 
{ 
    currentTime=savedInstanceState.getInt("currentTime",0); 
    startTimer(); 
} 
} 
+0

我正在我的AsyncTask中下載一些東西(這就是爲什麼我使用AsyncTask)。 –

+0

好的,答案有點大。我會很快回復你的。 –

相關問題