現在我有一個定時器在Fragment
s onCreate
方法(定時間隔1分鐘)啓動AsyncTask。所以這不是一個好主意,我相信因爲如果有配置更改片段將再次調用onCreate方法,我會有2運行Timer AsyncTasks對嗎?哪裏把AsyncTask,以便它只能啓動一次
所以我需要一些方法將AsyncTask放置在應用程序的整個生命週期中僅啓動一次的地方。
現在我有一個定時器在Fragment
s onCreate
方法(定時間隔1分鐘)啓動AsyncTask。所以這不是一個好主意,我相信因爲如果有配置更改片段將再次調用onCreate方法,我會有2運行Timer AsyncTasks對嗎?哪裏把AsyncTask,以便它只能啓動一次
所以我需要一些方法將AsyncTask放置在應用程序的整個生命週期中僅啓動一次的地方。
您可以使用Countdown Timer並在onDestroy()
中將其取消。這可以保證你只有一個在任何時間運行。
至於剛剛開始它只有一次,你將不得不堅持知識的地方取決於您的需求。也許在onSaveInstanceState
中存儲一個布爾值並在onCreate()
中讀取它會行嗎?
而且,正如@marcin_j指出,AsyncTasks按順序(除非特別啓動不同)執行的,因此,使用一個將阻止在你的應用程序的每個其他異步任務(比如下載的東西等)。
沒有簡單的計時器需要的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();
}
}
我正在我的AsyncTask中下載一些東西(這就是爲什麼我使用AsyncTask)。 –
好的,答案有點大。我會很快回復你的。 –
可能的簡單的方法是檢查'savedInstanceState'是否爲'null',那麼這意味着它是第一次創建'Fragment',所以我在那裏啓動AsyncTask? –
布爾方法是更好的方法,它也是未來的證明。我不確定'savedInstanceState'在後續啓動中是否保證不爲空,特別是如果您從不保存任何內容。 – meredrica