【问题标题】:SharedPreferences, gets the value in debug mode but not in run modeSharedPreferences,在调试模式下获取值,但在运行模式下不获取
【发布时间】:2017-03-16 10:36:24
【问题描述】:

我正在测试一个应用程序。登录推特,然后注销。 注销时,注销方法运行(在 MainActivity 的 Settings/Options 菜单中),我清除 sharedPreferences 并返回 loginActivity。

在 loginActivity(onCreate) 中,我使用 putBoolean 将布尔值设置为 true。 在 loginActivity 中,单击按钮我转到 MainActivity。在 mainActivity 中,我将值设为 false(默认值)。 但是,当我逐行调试我的应用程序时,我的 sharedPreferences.getBoolean("xxx",false) 方法返回 true。

我猜代码运行得如此之快,阻塞 I/O 会导致 sharedPreferences 无法在 LoginActivity 中获取真实值。

如果需要,请参阅下面的代码块:

    public class LoginActivity extends AppCompatActivity {
    @Override
     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
        Fabric.with(this, new Twitter(authConfig));
        setContentView(R.layout.activity_login);

    // Initialize application preferences
    mSharedPreferences = getSharedPreferences(Constants.PREF_NAME, 0);

    loginButton.setCallback(new Callback<TwitterSession>() {
        @Override
        public void success(Result<TwitterSession> result) {
            // ...

            isLoggedIn = true;

            // Save tokens and user info
            saveTwitterInfoSharedPref(session,isLoggedIn);

            goToMainActivity(consumerKey,consumerSecret);

        }


     private void saveTwitterInfoSharedPref(TwitterSession session, boolean isLoggedIn) {

     long userID = session.getUserId();

    /* Storing oAuth tokens to shared preferences */
    final Editor e = mSharedPreferences.edit();        
    e.putBoolean(Constants.TWITTER_LOGIN_STATUS, isLoggedIn);

    // Get UsersService via TwitterApiClient to get User object
    MyTwitterApiClient myTwitterApiClient = new MyTwitterApiClient(session);
    Call<User> user = myTwitterApiClient.getUsersService().show(userID, null, true);

        user.enqueue(new Callback<User>() {
            @Override
            public void success(Result<User> result) {
                String userProfileImgURL = result.data.profileImageUrlHttps;
                e.putString(Constants.PREF_USER_PROFILE_IMG_URL,userProfileImgURL);
                e.commit();
            }

            @Override
            public void failure(TwitterException exception) {

            }
        });

在 MainActivity 中:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case  R.id.itemMenuSignOut :
            SharedPreferences mSharedPreferences = getSharedPreferences(Constants.PREF_NAME, 0);
            TwitterLogOut logOut = new TwitterLogOut();
            logOut.logoutTwitter(getApplicationContext(),mSharedPreferences);
            startActivity(new Intent(MainActivity.this,LoginActivity.class));
            this.finish();
            break;
    }
    return true;
}

TwitterLogOut.class :

 public class TwitterLogOut {

    public void logoutTwitter(Context context, SharedPreferences sharedPreferences) {
      TwitterSession twitterSession = TwitterCore.getInstance().getSessionManager().getActiveSession();
        if (twitterSession != null) {
           Twitter.getSessionManager().clearActiveSession();
           Twitter.logOut();
           ClearSharedPref(sharedPreferences);
    }
}

  public static void ClearSharedPref(SharedPreferences mSharedPreferences){
     SharedPreferences.Editor editor = mSharedPreferences.edit();
     editor.clear();
     editor.commit();
  }
}

【问题讨论】:

  • 您需要调用 commit,以确保您对 SharedPref 的更改存在。在您的情况下,您正在放置布尔标志并启动异步任务,并在任务完成后提交您的更改
  • 是的 X3Btel,没错。我将所有编辑器方法和 goToMainActivity(,) 放在修复它的异步任务中。谢谢;)

标签: android sharedpreferences


【解决方案1】:

我认为你应该移动这条线:

  goToMainActivity(consumerKey,consumerSecret);

进入saveTwitterInfoSharedPref中的success方法,像这样:

user.enqueue(new Callback<User>() {
        @Override
        public void success(Result<User> result) {
            String userProfileImgURL = result.data.profileImageUrlHttps;
            e.putString(Constants.PREF_USER_PROFILE_IMG_URL,userProfileImgURL);
            e.commit();
            goToMainActivity(consumerKey,consumerSecret);
        }

        @Override
        public void failure(TwitterException exception) {
            // DO something here, like warn the user with a toast
        }
    });

这样,您可以确保登录成功,并且在进入 MainActivity 之前已保存首选项。

【讨论】:

  • 抓得好!那解决了它。谢谢奥拉比格!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多