Значение переменной отличается от присвоенного

#java #android #android-fragments

#java #Android #android-фрагменты

Вопрос:

Я использую фрагмент, который показывает различную информацию об объекте. Внутри onCreate фрагмента я извлекаю некоторые значения из объекта и сохраняю их в глобальных переменных:

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        String serializedShow = getArguments().getString(SHOW_TO_LOAD);
        mShow = (new Gson()).fromJson(serializedShow, Show.class);
        mScope = mShow.getScope();
        mLanguage = MainActivity.getSystemLanguage();
        mLanguage = mLanguage.replace("_", "-");
        mId = Integer.valueOf(mShow.getShowId()).toString(); //this line is important
        Log.v(LOG_TAG, "DetailFragment onStart, Id is "   mId);
    }
  

Как вы можете видеть, я присваиваю этой переменной определенный идентификатор. Я использую журнал, чтобы проверить, является ли значение mId правильным, и это так. Пока все работает хорошо.
Следующий ввод кода пользователь может нажать кнопку, чтобы открыть URL-адрес в браузере. URL-адреса отличаются при каждом создании этого фрагмента (каждый раз, когда этот фрагмент показывает разные вещи)

 private void fetchIMDBId(){
    Log.v(LOG_TAG, "starting IMDBAsyncTask with id "   mId);
    new Async4().execute(mId);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_launch:
            fetchIMDBId();
            return true;
        default:
            break;
    }
    return false;
}
  

Как вы можете видеть, вызывается метод fetchIMDBId() . У меня есть строка журнала, чтобы проверить, совпадает ли значение mId, которое было установлено ранее в onCreate .
Это не то же самое, это совершенно другое значение.
В частности, это идентификатор объекта, который отображался в предыдущем экземпляре, если этот фрагмент.

Пожалуйста, скажите мне, что я делаю не так. Спасибо.

E: объявление переменной

 public class DetailFragment extends Fragment {
private static final String LOG_TAG = DetailFragment.class.getSimpleName();
...
private String mScope, mLanguage, mId;
...

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
}
  

E: полный исходный код здесь

Комментарии:

1. Является ли переменная среднего класса или переменная экземпляра?

2. Что вы имеете в виду? Я добавил объявление в основной пост

3. Есть ли какие-либо сеттеры в mId? Вы уверены, что два журнала, которые вы проверяете, относятся к одному и тому же экземпляру вашего класса?

4. Переданный объект действителен. Среднее значение, возвращаемое журналом в oncreate, является правильным, и, кроме того, там средняя переменная больше не затрагивается. Я добавил полный источник для ясности.

Ответ №1:

Я полагаю, что вы неправильно назначаете свой mId для асинхронной задачи. Вы должны применить mid к методу асинхронной задачи, чтобы вызывался соответствующий mId из каждого фрагмента

 private void fetchIMDBId(String mId){
    Log.v(LOG_TAG, "starting IMDBAsyncTask with id "   mId);
    new Async4().execute(mId);
}
  

а затем вызовите метод внутри фрагмента

 fetchIMDBId(this.mId);
  

Комментарии:

1. По-прежнему не работает. В журнале запуска отображается правильное значение, но в журнале в fetchIMDBId отображается другое значение.

2. Вы пытались установить для переменной mId значение static?

3. ЭТО РАБОТАЕТ, я обязан тебе своей жизнью, спасибо.

4. Я рад, что это помогло вам 🙂 счастливого кодирования

Ответ №2:

Попробуйте использовать this.mId , а также проверьте, совпадает ли ваш объект fragment с предыдущим.

this.fetchIMDBId() Вместо этого вызовите.