Модернизация обратных вызовов и saveinstanceState

У меня есть сомнения относительно обратного вызова Retrofit2 и onSaveInstanceState. Я хочу сохранить состояние двух переменных, var1 и var2 в onSaveInstanceState. Две переменные (на самом деле не простые переменные) принимают свои значения в обратном вызове модификации в методе onResponse. Это длится всего миллисекунды, но если я поверну устройство до того, как две переменные получат свои значения в onResponse, произойдет сбой приложения. . Я не очень хорошо знаю, как поступить в этой ситуации. Я хотел бы знать ваши подходы к этому, чтобы избежать сбоя. (На самом деле у меня есть 2 обратных вызова для модификации, они независимы друг от друга, один для рисования графики, а другой для представления данных в текстовых представлениях). Заранее спасибо и извините за мое плохое знание английского языка.

  @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("var1",var1);
        outState.putInt("var2",var2);

   }

  retrofitcallback() {
       return new Callback<T>() {
                    public void onResponse() {
                       var1=...
                       var2=...
                    }
                    public void onFailure() {
                    }
       };
    }

person Carlos Hernández Gil    schedule 04.01.2016    source источник


Ответы (1)


Сначала приложение может аварийно завершать работу из-за того, что var1 и var2 являются нулевыми.

И что еще более важно - я предлагаю вам подумать о своем клиент-серверном дизайне. Вы используете обратные вызовы и вызовы модификации в классах пользовательского интерфейса - это плохой подход, поскольку он приводит к утечкам памяти и вряд ли возможно управлять жизненным циклом. Подумайте об использовании загрузчиков или сервисов, это будет намного лучше и проще для вас.

P.S. При сбое приложения всегда предоставляйте трассировку стека.

person Vasilov Artur    schedule 04.01.2016
comment
Спасибо за Ваш ответ. Я не могу использовать загрузчики, так как я не использую базу данных. Под службами я полагаю, что вы имеете в виду IntentService, я думал об этом раньше, но я не очень хорошо понимаю преимущества использования службы, мне все еще нужно сохранить результат службы в переменной и использовать его в onSaveInstanceState, и если пользователь поворачивает экран до завершения службы, у меня была бы такая же проблема, не так ли? - person Carlos Hernández Gil; 05.01.2016
comment
Вы также можете использовать загрузчики без базы данных. Загрузчики с LoaderManager заботятся о жизненном цикле Activity/Fragment. Вы просто отправляете запрос в методе загрузчика onForceLoad и в обратном вызове модифицированного вызова deliveryResult. Все ваши данные не будут уничтожены при перезапуске активности. То же самое можно сделать и с Сервисом (обычным Сервисом или ИнтентСервисом - неважно), но получить результат будет сложнее. Otto/EventBus как возможные варианты. - person Vasilov Artur; 06.01.2016