我正在测试应用。登录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();
}
}
答案 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之前已保存首选项。