2012-05-21 50 views
2

我開始AsyncTask並將Context放置在任務的構造函數中。如何在onPostExecute中確定該活動現在沒有暫停或被銷燬?

onPostExecute我想知道是我的活動現在活動,並沒有重新創建。如何做更好?

爲此,我可以:

  • onCreate活動創造randomNumber,然後把它放在Application類;

  • onPause/onDestroy將randomNumber設置爲0,並在onResume restore randomNumber;

  • in onPreExecute() get randomNumber和onPostExecute比較randomNumber和Application randomNumber。

可能我可以使用上下文作出決定......?

回答

0

有許多方法來檢查活動是否仍然存在。

我通常用以下結構創建SkeletonActivity

public class SkeletonActivity extends FragmentActivity { 
    private boolean paused = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     paused = false; 
    } 
    @Override 
    public void onPause() { 
     super.onPause(); 
     paused = true; 
    } 
    @Override 
    public void onResume() { 
     super.onResume(); 
     paused = false; 
    } 
    @Override 
    public void onStart() { 
     super.onStart(); 
     paused = false; 
    } 
    public boolean isPaused() { 
     return paused; 
    } 
} 

現在,讓我們所有的活動擴展這個SkeletonActivity。最後,改變這個基類你想改變暫停標誌(例如更新了它onDestroy()


另一種方法是有內部的SkeletonActivity一個Context實例:

public class SkeletonActivity extends FragmentActivity { 
    private Context mContext; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mContext = this; 
    } 
    @Override 
    protected void onDestroy() { 
     mContext = null; 
     super.onDestroy(); 
    } 
    public boolean isPaused() { 
     return mContext==null; 
    } 
} 
+0

第一種方法。我怎麼能從'公共類TaskGetOrderPay擴展AsyncTask'從'isPaused()'...中獲取值? 第二種方法。在'doInBackground'中我使用上下文,因此設置'mContext = null;'會導致NullPoinException。 – Sviatoslav

+0

如果它是一個單獨的java文件中的AsyncTask,那麼您應該傳遞對SkeletonActivity的引用。但是,如果它在你的Activity中,你可以檢查'if(isPaused())'。在第二種方法中,您還應該在使用上下文之前檢查「if(isPaused())」。順便說一句,我使用第一種方法:布爾標誌更安全 –

+0

你認爲,對活動的引用 - 是一種好方法嗎? – Sviatoslav

0

請有在onRetainNonConfigurationInstance()中,我將它設置爲null,在onCreate()期間,我將Context修補到當前正在運行的Activity中,您可以通過設置「task = null」來增強它onDestroy():

public class MyActivity extends Activity { 

    /* package */ MyActivity context; 

    private class MyAsyncTask extends AsyncTask<Void, Void, Void> { 

     public MyAsyncTask(final MyActivity context) { 
      super(); 

      this.context = context; 
     } 

     @Override 
     protected Cursor doInBackground(/* ... */) { 
      // ... 
     } 

     @Override 
     protected void onPostExecute(/* ... */) { 
      if (context != null) { 
       // ... 
      } 
     } 

     @Override 
     protected void onPreExecute (/* ... */) { 
      // ... 
     } 
    } 

    /* package */ MyAsyncTask task; 

    @Override 
    public void onCreate(final Bundle bundle) { 
     // ... 

     Bundle bundleExtras = getIntent().getExtras(); 
     if (bundleExtras != null) { 
      task = (MyAsyncTask) getLastNonConfigurationInstance(); 
      if (task != null) { 
       task.context = this; 
       // ... 
      } else { 
       task = new MyAsyncTask(this); 
       task.execute(); 
      } 
     } 
    } 

    @Override 
    public Object onRetainNonConfigurationInstance() { 
     if (task != null) { 
      // ... 

      task.context = null; 
     } 

     return task; 
    } 
} 
0

這對其他人會有幫助。

如果按home鍵或後退按鈕的onStop()將called.so申報活動中的變量像

boolean isActivityclosed=false; 

在的onStop()方法中設置的值設置爲true。

@Override 
    protected void onStop() { 
     super.onStop(); 
     isActivityclosed=true; 

    } 

現在,在postExcecute方法檢查變量是否爲true。如果它是真的,那麼你的活動在後臺。

相關問題