我試圖按照以下pattern來確保在活動被銷燬時執行我的後臺任務。由於我想在不同的活動中重用我的任務,因此我爲每個任務實施了一個「TaskMethod」類。使用AsyncTask時的活動在關閉時崩潰
public class TaskMethod
{
private SomeActivity mAct_ = null;
private MyTask mTask_ = null;
public TaskMethod(SomeActivity act)
{
mAct_ = act;
}
public void execute()
{
mTask_ = (MyTask) mAct_.getLastNonConfigurationInstance();
if (mTask_ != null)
{
mTask_.activity_ = mAct_;
if (mTask_.isFinished_)
mTask_.updateUI();
}
else
{
mTask_ = new MyTask();
mTask_.activity_ = mAct_;
mTask_.execute();
}
}
public void cleanUp()
{
myTask_.activity_ = null;
if (mAct_.isFinishing())
myTask_.cancel(false);
}
static class MyTask extends AsyncTask<Void, Void, String>
{
@Override
protected String doInBackground(Void... params)
{
...
}
@Override
protected void onPostExecute(String result)
{
...
isFinished_ = true;
updateUI();
}
public void updateUI()
{
if (activity_ != null)
{
...
}
}
SomeActivity activity_ = null;
boolean isFinished_ = false;
}
所以,我想在活動中使用任務每一次,我宣佈它
公共類SomeActivity {
private TaskMethod task_;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
task_ = new TaskMethod(this);
task_.execute();
}
@Override
public void onDestroy()
{
super.onDestroy();
task_.cleanUp();
}
}
然而,當我的活動關閉,我得到以下例外:
07-21 19:37:15.195: E/AndroidRuntime(25724): FATAL EXCEPTION: main
07-21 19:37:15.195: E/AndroidRuntime(25724): java.lang.RuntimeException: Unable to destroy activity
{com.signals.signals/com.signals.signals.activity.PreferencesActivity}: java.lang.NullPointerException
07-21 19:37:15.195: E/AndroidRuntime(25724): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3108)
07-21 19:37:15.195: E/AndroidRuntime(25724): at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3126)
07-21 19:37:15.195: E/AndroidRuntime(25724): at android.app.ActivityThread.access$1200(ActivityThread.java:122)
07-21 19:37:15.195: E/AndroidRuntime(25724): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1179)
07-21 19:37:15.195: E/AndroidRuntime(25724): at android.os.Handler.dispatchMessage(Handler.java:99)
07-21 19:37:15.195: E/AndroidRuntime(25724): at android.os.Looper.loop(Looper.java:137)
07-21 19:37:15.195: E/AndroidRuntime(25724): at android.app.ActivityThread.main(ActivityThread.java:4340)
07-21 19:37:15.195: E/AndroidRuntime(25724): at java.lang.reflect.Method.invokeNative(Native Method)
07-21 19:37:15.195: E/AndroidRuntime(25724): at java.lang.reflect.Method.invoke(Method.java:511)
07-21 19:37:15.195: E/AndroidRuntime(25724): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-21 19:37:15.195: E/AndroidRuntime(25724): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-21 19:37:15.195: E/AndroidRuntime(25724): at dalvik.system.NativeStart.main(Native Method)
07-21 19:37:15.195: E/AndroidRuntime(25724): Caused by: java.lang.NullPointerException
07-21 19:37:15.195: E/AndroidRuntime(25724): at com.signals.signals.activity.tasks.CitiesTaskMethod.cleanUp(CitiesTaskMethod.java:92)
07-21 19:37:15.195: E/AndroidRuntime(25724): at com.signals.signals.activity.PreferencesActivity.onDestroy(PreferencesActivity.java:117)
07-21 19:37:15.195: E/AndroidRuntime(25724): at android.app.Activity.performDestroy(Activity.java:4629)
07-21 19:37:15.195: E/AndroidRuntime(25724): at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1079)
07-21 19:37:15.195: E/AndroidRuntime(25724): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3095)
我在做什麼錯?謝謝!
我在想那個......但是如果activity_還沒有被破壞,task_會是怎樣的呢?它發生在onDestroy()方法後面。 – 2012-07-21 20:21:52