Stackoverflow中有很多回答的问题,使用getActivity()==null
如何检查活动本身的活动是否为空?
我的具体案例是:
活动启动asynctask,然后活动被销毁,然后asynctask在onPostExecute中返回,它调用activity中的一个方法(注册为该任务的一个监听器),这个方法使用对THIS的引用来传递一个上下文一个方法。但是,上下文为空。
编辑:这是一些代码。
public interface OnGetStuffFromServerListener {
void onGetStuffSuccess();
}
public class SomeActivity implements OnGetStuffFromServerListener {
@Override
public whatever onCreate() {
new GetStuffFromServer(this).execute();
}
@Override
public void onGetStuffFromServerSuccess() {
deleteSomeFiles(this); // NPE -> How do I check if activity still exists here?
}
private void deleteSomeFiles(Context context) {
...
context.getExternalFilesDir(null).toString(); // NPE toString on a null object reference
}
}
public class GetSomeStuffFromServer extends AsyncTask<Void, Void, Void> {
private OnGetSomeStuffFromServerListener listener;
public GetSomeStuffFromServer (OnGetSomeStuffFromServerListener listener) {
this.listener = listener;
}
...doInBackground
onPostExecute() {
if(listener!=null) {
listener.onGetSomeStuffFromServerSuccess();
}
}
}
实际上,如果我使用的是getApplicationContext()而不是这个,那么我可能根本就没有问题吗?
答案 0 :(得分:1)
我不确定您的活动为何被销毁。虽然您可以使用Bundle重新创建活动。 Google的documentation活动提供了以下用于保存和恢复活动实例的示例。
以下内容将保存您的活动状态:
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
将调用以下内容来恢复您之前的活动状态。请注意,逻辑包含在onCreate()中,因此听起来您将再次初始化Activity。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
...
}
如果有帮助,请告诉我!
编辑:
尝试取消onDestroy()中的操作。如果Activity已调用onDestroy(),则其内存已被设备释放。确保您不会在代码中的任何其他位置处置您的“活动”。
@Override
protected void onDestroy() {
asynctask.cancel(true);
super.onDestroy();
}
答案 1 :(得分:0)
使用myActivity.isDestroyed()