2012-07-21 6 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()을 호출하는 경우는 null이므로, 전화를 걸기 전에 변수를 null로 확인하면됩니다. 희망이 도움이됩니다.

+0

나는 그것에 대해 생각하고있었습니다 ...하지만 활동이 아직 파괴되지 않았다면 어떻게 task_가 null이 될 수 있습니까? 그것은 onDestroy() 메소드 afterall에서 발생합니다. –

1

활동을 마치면 onDestroy()가 호출되고 내부에서 사용자 자신의 정리 기능을 호출합니다.

이 함수의 변수 중 하나는 null이므로 NullPointerException을 반환하므로 해당 활동을 삭제할 수 없습니다.

정리 기능 안에 중단 점을 넣고 거기에 사용 된 변수 값을 확인하십시오. 그들 중 하나 (아마도 mAct_)는 널입니다.

관련 문제