【发布时间】: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(,) 放在修复它的异步任务中。谢谢;)