一位客户在使用任务杀手杀死应用程序后,已向我发送有关我的应用程序部队在启动时关闭的反馈。我告诉他任务杀手是危险的,并且对手机性能没有任何好处,因为Android不管Windows作为RAM,但他不会卸载任务杀手。
Force Close就是这样:
A)用户通常使用我的应用程序
B)用户任务杀死了我的应用
C)用户再次启动我的应用程序
D)启动时强行关闭
E)用户再次启动我的应用程序
F)一切都按预期工作
我发现问题是我的静态对象变为null,因为它们是从RAM中清除的,导致强制关闭应用程序的NullPointerExceptions。但是,我有很多地方可以访问这些静态对象(如果不是这种情况我甚至不会使用静态对象),所以NullPointerExceptions可以在很多地方发生。
此行为仅发生在Android 2.3.7或更低版本中。 Android 4.0自己的任务杀手(你可以通过长按Home访问的那个)正确杀死应用程序,然后在没有任何强制关闭的情况下启动它。
我如何规避这种行为?
答案 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)
。