2016-03-09 141 views
1

我輸出同一個對象,但我得到了不同的結果... 什麼可能是不同的結果的原因?Android相同的實例輸出不同的結果

在UserHelper.class功能:

public void login(String phone, String password) { 
    UserModel.logInInBackground(phone, password, new LogInCallback<UserModel>() { 
     @Override 
     public void done(UserModel userModel, AVException e) { 
      if (null != userModel) { 
       if (userModel.getPosition() == UserModel.USER_BUYER) { 
        refresh(); 
        DebugLog.e("fuck" + mUserStatus + UserInstance.getInstance().getUserStatus()); 
        for (UserListener listener : listeners) 
         listener.OnUserLogin(); 
       } else if (userModel.getPosition() == UserModel.USER_SELLER) 
        logout(); 
      } else for (UserListener listener : listeners) 
       listener.HandleError(e.getCode()); 
     } 
    }, UserModel.class); 

public USER_STATUS getUserStatus() { 
    return mUserStatus; 
} 

而且UserInstance.class。

public class UserInstance { 
    public static UserHelper mInstance; 

public static UserHelper getInstance() { 
    if (null == mInstance) mInstance = new UserHelper(); 
    DebugLog.e(mInstance.toString()); 
    return mInstance; 
    } 
} 
+0

究竟哪個對象應該是相同的? mUserStatus和UserInstance.getInstance()。getUserStatus()?哪個類包含登錄方法? – agi

+0

是 public USER_STATUS getUserStatus(){ return mUserStatus; } – Aquarids

+0

所以'login(..)'是'UserHelper'的一個方法?!您是否調試過在其中記錄對象的行,以比較對象ID?我需要更多的代碼 - 你在哪裏調用登錄方法? – agi

回答

1

首先,如果你的意思是UserHelper類是單身, 你爲什麼訪問使用UserInstance.getInstance().getUserStatus(),而不是僅僅getUserStatus()USER_STATUS實例?

其次,如果您從不同的線程訪問單例,您可能會得到不同的UserHelper實例,因爲您的實現不是線程安全的。

正確的實施將使用double locking pattern

public class UserInstance { 
    public static UserHelper mInstance; 
    private static final ReentrantLock lock = new ReentrantLock(); 

    public static UserHelper getInstance() { 
     if (null == mInstance){ 
      lock.lock(); 
      try{ 
       if (null == mInstance){ 
        mInstance = new UserHelper(); 
       } 
      } 
      finally{ 
       lock.unlock(); 
      } 
     } 
     DebugLog.e(mInstance.toString()); 
     return mInstance; 
    } 

}

+0

哦,我忘了。但是我仍然使用你的代碼得到不同的實例... – Aquarids

0

最終,我得到了相同的實例..

感謝施洛米Uziei。我忘了使用雙重鎖定模式。我不應該讓靜止的...

相關問題