任务填充应用程序后启动强制关闭

时间:2013-02-01 10:48:09

标签: android performance nullpointerexception taskkill

一位客户在使用任务杀手杀死应用程序后,已向我发送有关我的应用程序部队在启动时关闭的反馈。我告诉他任务杀手是危险的,并且对手机性能没有任何好处,因为Android不管Windows作为RAM,但他不会卸载任务杀手。

Force Close就是这样:

A)用户通常使用我的应用程序

B)用户任务杀死了我的应用

C)用户再次启动我的应用程序

D)启动时强行关闭

E)用户再次启动我的应用程序

F)一切都按预期工作

我发现问题是我的静态对象变为null,因为它们是从RAM中清除的,导致强制关闭应用程序的NullPointerExceptions。但是,我有很多地方可以访问这些静态对象(如果不是这种情况我甚至不会使用静态对象),所以NullPointerExceptions可以在很多地方发生。

此行为仅发生在Android 2.3.7或更低版​​本中。 Android 4.0自己的任务杀手(你可以通过长按Home访问的那个)正确杀死应用程序,然后在没有任何强制关闭的情况下启动它。

我如何规避这种行为?

1 个答案:

答案 0 :(得分:0)

我解决了。

解决方案并非最佳,但可行:

我创建了一个这样的界面:

public interface StaticAccessTo<T>{
    public void returnStatic(T object);
}

我没有使用静态对象的getter,而是:

public void getWhatever(StaticAccessTo<Whatever> callback){
    if (whatever == null){
        loadWhateverFromServer(callback);
    } else {
        callback.returnStatic(whatever);
    }
}

private void loadWhateverFromServer(StaticAccessTo<Whatever> callback){
    new AsyncTask<Void,Void,Void>(){

    public Void doInBackground(Void... params){
        whatever = loadWhatever();
        return null;
    }

    public void onPostExecute(Void result){
        callback.returnStatic(whatever);
    }

    }.execute();
}

因此,如果whatever不为null,它将立即调用returnStatic(whatever)并可以访问主线程中的whatever。否则,它将自动从网络加载它,并在加载时从主线程调用returnStatic(whatever)