2015-07-09 3 views
1

Я повторно представляю этот вопрос, так как я не думаю, что мой последний действительно попал в проблему, с которой я столкнулся.Тема: Возврат к пользовательскому интерфейсу - Не создана?

Так что я поток, который возвращается, а затем использует обработчик для обновления пользовательского интерфейса, как:

public void completeSignIn(final boolean success, final String error) { 
    Log.d(Constants.LogTag, "Finalising Sign In..."); 
    final Looper mainLooper = Looper.getMainLooper(); 
    final Handler mainHandler = new Handler(mainLooper); 
    mainHandler.post(new Runnable() { 

     @Override 
     public void run() { 
      if (success) { 
       TextView tv = (TextView) getActivity().findViewById(R.id.register); 
       tv.setText("SIGNED IN!!"); 
      } else if (!success) { 
      } 
     } 
    }); 
} 

Проблема, которую я имею, что поскольку поток может вернуться в любой момент после того, как это делается запрашивая сервер, нет gaurantee, что getActivity() вернет Activity. Я обнаружил, что если я поверну свое устройство, когда поток вот-вот вернется, этот бит кода можно вызвать между циклами destroy/create. Я не уверен, что важно использовать фрагмент здесь, но я не думаю, что есть вред в использовании родительской активности для обновления представлений?

Так что я не уверен, как я могу заставить обработчика ждать, пока действие не будет создано - возможно ли это, или это стандартный способ борьбы с этим? Как я не вижу этого в других приложениях, которые я тестировал.

UPDATE

Я положил некоторые журналы в моем фрагменте и удалось получить следующие чтобы проиллюстрировать мою проблему:

07-09 22: 17: 15.164 25435-25435 /? D/Kevins_Tag: Отделяющая деятельность ...

07-09 22: 17: 15.234 25435-26702 /? D/Kevins_Tag: Подписание ...

07-09 22: 17: 15.234 25435-26702 /? E/Kevins_Tag: Деятельность равна нулю

07-09 22: 17: 15.234 25435-26687 /? D/Kevins_Tag: Завершение регистрации ...

07-09 22: 17: 15.284 25435-25435 /? D/Kevins_Tag: Присоединение ...

07-09 22: 17: 15.284 25435-25435 /? D/Kevins_Tag: активность Exists

Как вы можете видеть, поток вызывает интерфейс между ними отсоединиться и прикрепить ...

+0

'Я обнаружил, что если я поверну свое устройство, когда поток вот-вот. «Активность» воссоздается. См. Http://stackoverflow.com/questions/2620917/how-to-handle-an-asynctask-during-screen-rotation и http://stackoverflow.com/questions/7128670/best-practice-asynctask-during- change-change –

+0

Моя проблема не в том, что поток перезапускается при повторном создании активности. Я знаю, как я должен справиться с этим (рабочие фрагменты). Моя проблема в том, что когда поток возвращается к пользовательскому интерфейсу, он может быть между удалением и созданием. Я также не думаю, что просто отключение изменений конфигурации является хорошим решением. Я знаю, что должен быть правильный способ справиться с этим, но я действительно изо всех сил пытаюсь его найти, –

+0

'Моя проблема не в том, что поток перезапускается при повторном создании активности. Прочтите ссылки. –

ответ

1

я не знаю наверняка, если это может решить вашу проблему, но одна вещь Я хотел бы попробовать это проверить на существующей деятельности, прежде чем делать что-либо, например:

//any code 

Activity activity = getActivity(); 

if(activity != null) { 
    if (success) { 
     TextView tv = (TextView) activity.findViewById(R.id.register); 
     tv.setText("SIGNED IN!!"); 
    } else if (!success) { 
    } 
} 

//any code 
+0

Спасибо - я попробовал это, чтобы просто зафиксировать ошибку. Unfortunatelt просто игнорирует выполнение задачи не поможет - так как своевременное вращение может существенно отменить запрос на вход, то –

+0

Может быть, если вы попытаетесь это сделать, можете помочь вам ** '' **. Но подумайте, что более высокая производительность может быть достигнута, если вы используете _Service_ вместо _Activity_ для этого. –

+0

Спасибо, но это будет просто маскировать проблему - я хочу иметь дело с ней правильно –

1

Как вы объясните в вашем вопросе, метод completeSignIn() находится в одном из ваших фрагментов. Файл Runnable, который содержит completeSignIn(), является внутренним классом фрагмента и как таковой содержит ссылку на фрагмент. Таким образом, код в Runnable может вызвать метод фрагмента getActivity() - вызов выполняется с использованием ссылки «скрытый» фрагмент.

Вы правильно заметили, что во время изменения конфигурации completeSignIn() может быть вызван после того, как фрагмент был отсоединен от действия, что приведет к ссылке нулевой активности. Вы спросите:

Я не уверен, как я могу заставить обработчик ждать, пока активность не создается

Это не возможно в этом случае. Однако, даже если бы это было так, это не помогло бы.Фрагмент, который ссылается на completeSignIn(), является мертвым. Он был отделен и уничтожен, и в конечном итоге будет собран мусор. Когда ваша деятельность воссоздана, старый фрагмент не используется - создается новый фрагмент и проходит стадии создания жизненного цикла, используя сохраненное состояние старого фрагмента.

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

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