2016-03-09 4 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

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

+0

поэтому 'login (..)' это метод 'UserHelper' ?! Вы отлаживали строку, в которой вы регистрировали объекты, для сравнения идентификаторов объектов? Мне нужно больше кода - где вы называете метод входа? – agi

ответ

1

Прежде всего, если вы имели в виду в UserHelper класс быть синглтон, почему вы получаете доступ к USER_STATUS экземпляра с помощью UserInstance.getInstance().getUserStatus() вместо того, чтобы просто getUserStatus()?

Во-вторых, вы, возможно, получаете разные экземпляры 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. Я забыл использовать шаблон двойной блокировки. И я не должен делать mInstance static ...

Смежные вопросы