2012-07-21 73 views
0

我试图按照以下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) 

我在做什么错?谢谢!

回答

1

看起来好像当你打电话cleanUp()task_它是null,所以你只需要在进行该调用之前对变量进行空检查。希望这可以帮助。

+0

我在想那个......但是如果activity_还没有被破坏,task_会是怎样的呢?它发生在onDestroy()方法后面。 – 2012-07-21 20:21:52

1

当你完成你的活动时,onDestroy()被调用,并且在那里,你正在调用你自己的清理函数。

此函数中的一个变量为null,因此它返回NullPointerException,因此无法销毁该活动。

在清理函数内部放置一个断点并检查那里使用的变量的值。其中一个(最可能mAct_)为空。