我的应用程序中存在一个非常临时性的问题。当我的应用程序长时间在后台停留,然后在启动它的某个时候,应用程序崩溃,日志猫显示NullPointerException
,它是由我设置为特定类的静态变量的用户对象抛出的。>
让我详细解释一下:
我有一个Application类,其中包含一个静态变量名用户,该用户在成功登录时设置,或者在应用通过读取设备中的登录数据启动时设置。
因此,当用户使用我的应用程序而忘记关闭它并开始使用其他应用程序时。当用户再次启动我的应用程序时,我们说两天后(用户至今从未关闭过该应用程序)它崩溃了。问题是Application类的静态变量用户上的空指针异常。我们如何处理这种情况?
当我的应用崩溃后重新启动时,我的应用运行正常。
答案 0 :(得分:1)
我们可以继续说明发生这种情况的原因,但我建议您开始使用良好做法,而不要这样做。首先,您通常应避免在活动/片段中存储任何数据,因为您无法保证何时重新创建它们。为此使用ViewModel:https://developer.android.com/topic/libraries/architecture/viewmodel。 对于您的特定问题,用户首选项/临时数据应存储在SharedPreferences中,但是您应该创建某种服务或其他层,并且不要在您的活动/片段中直接调用它。示例:
public class PreferencesService {
private static final String USER_NAME_KEY = "username";
private SharedPreferences preferences;
public PreferencesService(Context context) {
preferences =
PreferenceManager.getDefaultSharedPreferences(context);
}
public void writeUsername(String username) {
preferences.edit().putString(USER_NAME_KEY,
username).apply();
}
public String readUsername() {
return preferences.getString(USER_NAME_KEY, "");
}
}
答案 1 :(得分:0)
我建议将登录信息放入SharedPreference
中,然后从onResume
函数中的首选项中读取登录数据。这样,应用程序每次都会从SharedPreference
获取数据,并保存存储在SharedPreference
中的值。
但是,如果应用程序未关闭,则不应丢失静态值。我建议检查是否还有其他生命周期方法(例如onDestroy
)在静态变量中分配了值null
,这可能会引起问题。
答案 2 :(得分:0)
当应用程序后台运行时,系统可能会清除为变量保留的内存,我建议使用saveInstanceState
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
outState.putParcelable(TAG_FOR_BUNDLE, objectToSave);
super.onSaveInstanceState(outState);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
objectToSave = savedInstanceState.getParcelable(TAG_FOR_BUNDLE);
}
}