【问题标题】:Overwriting values of a variable in Shared Preferences or Creating a lot of variables?覆盖共享首选项中的变量值或创建大量变量?
【发布时间】:2019-04-23 01:46:12
【问题描述】:

我对 Android 很陌生,最近遇到了需要使用 SharedPreferences 的情况: 我有一个随着项目的进行而更改的变量,并且应用程序根据变量的值在不同的屏幕中启动,例如,如果值为 0,则应用程序应在 LoginManager.class 中启动,如果为 1,则在MainActivity.class。

因此,每当我成功登录时,状态都会更改为 1(因此我不必每次都登录)或者如果我注销状态为 0。
鉴于此,当然需要将变量保存在外部,以免值丢失,并在我创建第一个屏幕时检索它。

所以我的逻辑是我创建了一个 onDestroy 方法,所以当屏幕关闭时,任何全局变量“state”都是 SharedPreference 变量“sharedstate”将得到的(这是来自我的初始 Activity):

private SharedPreferences sharedPref;
public static int state=0;


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_first);
    pb = (ProgressBar) findViewById(R.id.pb);
    mContext = IntroManager.this;
    pb.setVisibility(ProgressBar.VISIBLE);
    CountDownTimer mCountDownTimer;
    pb.setProgress(i);
    sharedPref = mContext.getSharedPreferences("Apathy", Context.MODE_PRIVATE);
    getProfile();
    mCountDownTimer=new CountDownTimer(1500,1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            Log.v("Log_tag", "Tick of Progress"+ i+ millisUntilFinished);
            i++;
            pb.setProgress((int)i*100/(1500/1000));
        }

        @Override
        public void onFinish() {
            check();
            i++;
            pb.setProgress(100);
        }
    };
    mCountDownTimer.start();
}

@Override
protected void onDestroy (){
    super.onDestroy();
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putInt("sharedstate", 1);
    editor.commit();
}

private void getProfile() {
    String sharedstate = sharedPref.getString("state", "");
    state= Integer.parseInt(sharedstate);
}

public void check(){
    if(state == 0){
        Intent mcrIntent = new Intent(IntroManager.this, LoginManager.class);
        startActivity(mcrIntent);
        overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
    }else{
        if(state == 1){
            Intent mcrIntent = new Intent(IntroManager.this, MainActivity.class);
            startActivity(mcrIntent);
            overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
        }
    }
}

所以我陷入了两难境地:如果我在所有屏幕中都使用相同的 onDestroy 方法(因为我无法预测应用程序将在哪里关闭),相同的“共享状态”是否会改变它的值或它创建了一堆称为 Sharedstate 的变量?他们是否被保存在同一个“冷漠”中?

【问题讨论】:

  • 为什么要在 onDestroy 中更新它?登录成功和注销成功时不能更新吗?
  • 是的,我也注意到了,我要更新项目

标签: java android android-studio


【解决方案1】:

我相信这段代码会一遍又一遍地更新相同的值,而不是重复。

如果您想查看共享首选项的外观,可以查看以下答案:How can I view the shared preferences file using Android Studio?

话虽如此,正如 Vivart 所写,每次调用 onDestroy 时都不需要更新首选项,您只需要在登录成功或注销时更新

【讨论】:

  • 谢谢大佬,我去看看那个链接!
【解决方案2】:

每次 Activity 调用 onDestroy 时都会覆盖相同的值。 SharedPreferences 是保存在创建它们的手机上的自己的文件。标签“Apathy”是文件名,“sharedstate”是保存值的键。

这就是 SharedPreferences 的强大功能,您可以非常轻松地保存原始数据。但是当应用程序被卸载时,首选项也消失了。

也许寻找一些视频和教程,那里有很多。 Documentation 也很有帮助(但对于初学者来说有时很难理解)

【讨论】:

    【解决方案3】:

    如果有人真的在寻找它,我设法做到了,我创建了一个管理所有这些的新类,在这种情况下称为“Util_Preferencias”:

    package com.example.user.mkpos;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import static com.example.user.mkpos.IntroManager.state;
    
    
    public class Util_Preferencias {
    
        Context miContexto;
        private SharedPreferences PreferenciasConfiguaracion;
        private  SharedPreferences.Editor editorPrefConfig;
    
        public Util_Preferencias(Context elContexto){
            miContexto=elContexto;
            PreferenciasConfiguaracion = miContexto.getSharedPreferences("PrefConfig",miContexto.MODE_PRIVATE);
            editorPrefConfig = PreferenciasConfiguaracion.edit();
        }
    
    
        public void GuardaPrefConfig(String estado){
            editorPrefConfig.putString("estado",estado);
            editorPrefConfig.commit();
        }
    
        public void CargaPref_Configuracion(){
            SharedPreferences prefs = miContexto.getSharedPreferences("PrefConfig",miContexto.MODE_PRIVATE);
            state = Integer.parseInt(prefs.getString("estado","0"));
        }
    
    }
    

    每当我需要给状态一个新值时,我调用 GuardaPrefConfig,当我需要检索时,我使用 CargaPref_Configuracion(通过像这样在想要的活动中调用 Uitl_Activity 类:)

    Util_Preferencias UtilPreferencias = new Util_Preferencias(getApplicationContext());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多