当应用长时间处于后台运行后恢复正常运行时,静态对象变为空

时间:2018-09-02 07:37:45

标签: java android

我的应用程序中存在一个非常临时性的问题。当我的应用程序长时间在后台停留,然后在启动它的某个时候,应用程序崩溃,日志猫显示NullPointerException,它是由我设置为特定类的静态变量的用户对象抛出的。

让我详细解释一下:

我有一个Application类,其中包含一个静态变量名用户,该用户在成功登录时设置,或者在应用通过读取设备中的登录数据启动时设置。

因此,当用户使用我的应用程序而忘记关闭它并开始使用其他应用程序时。当用户再次启动我的应用程序时,我们说两天后(用户至今从未关闭过该应用程序)它崩溃了。问题是Application类的静态变量用户上的空指针异常。我们如何处理这种情况?

当我的应用崩溃后重新启动时,我的应用运行正常。

3 个答案:

答案 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);
    }
}