【问题标题】:Static objects becomes null when app brought back after being in background for long time应用程序在后台长时间返回后,静态对象变为空
【发布时间】:2018-09-02 17:28:21
【问题描述】:

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

让我详细解释一下:

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

所以当用户使用我的应用程序并忘记关闭它并开始使用另一个应用程序时。当用户再次启动我的应用程序时,假设 2 天后(用户迄今为止从未关闭过应用程序)它崩溃了。问题是应用程序类的静态变量用户的空指针异常。我们该如何处理这种情况?

当应用程序崩溃后重新启动时,我的应用程序运行良好。

【问题讨论】:

  • “到目前为止,用户从未关闭过应用程序”,但 Android 确实如此。最好使用 Shared Preference 来存储任何值并在调用应用程序类时检索相同的值。
  • 你可以使用静态最终变量,虽然我建议你使用 SharedPreferences

标签: java android


【解决方案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, "");
    }
}

【讨论】:

    【解决方案2】:

    我建议将登录信息放在SharedPreference 中,然后在onResume 函数中从首选项中读取登录数据。这样,应用程序每次都会从SharedPreference 获取数据,并保存存储在SharedPreference 中的值。

    但是,如果应用未关闭,您不应丢失静态值。我建议检查是否有任何其他生命周期方法(例如onDestroy)在您的静态变量中分配了值null,这可能会引发问题。

    【讨论】:

    • 不,没有。
    【解决方案3】:

    应用后台时系统可能会清除为变量保留的内存,我建议使用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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多