SharedPreferences,在调试模式下获取值,但在运行模式下不获取

时间:2016-11-02 23:19:03

标签: android sharedpreferences

我正在测试应用。登录twitter然后注销。 注销时,运行注销方法(在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();
  }
}

1 个答案:

答案 0 :(得分:1)

我认为你应该移动这一行:

  goToMainActivity(consumerKey,consumerSecret);

进入success中的saveTwitterInfoSharedPref方法,如下所示:

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之前已保存首选项。