2015-04-20 3 views
5

У меня есть MainActivity, которая использует фрагменты.Фрагменты и темы на Android

OnCreate из MainActivity завершает OnCreate с использованием

welcomeFragment = new MyWelcomeFragment(); 
fr.beginTransaction().replace(R.id.mainContent, welcomeFragment).commit() 

Как часть MyWelcomeFragment на onResume, как поток начал получать обновления от моего веб-сервера. Если пользователь выбирает действие до завершения потока и переходит в MyNewsFragment, что происходит с потоком, который еще не завершил работу в поточном потоке MyWelcomeFragment?

Тема была создана с: (MyThread и обработчик переменные экземпляра)

myThread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        sendDataToServer(""); 
        handler = new Handler(Looper.getMainLooper()); 
        handler.post(new Runnable() { 
         public void run() { 
          onTaskDone(); 
         } 
        }); 
       } 
      }); 
      myThread.start(); 
+0

Что такое * thread stack *? – dcow

+1

Этот 'onTaskDone' может быть проблематичным, если он пытается обновить части обзора, а' Активность' уже завершена. Почему бы вам не использовать стандартный API «AsyncTask»? –

+0

нить будет продолжать работать до тех пор, пока она не завершит задачу. – apk

ответ

2

Dalvik сохраняет все ссылки на резьбу во время выполнения, поэтому ваша нить будет продолжать работать, если она не будет завершена или завершена (некоторые reference). Поэтому, в зависимости от того, где вы начинаете свой поток, вы можете создавать более одного. Существует no clean way, чтобы отменить Thread, и в этом случае вам может потребоваться сначала отменить HTTP-запрос внутри sendDataToServer и использовать общий флаг для остановки потока.

В более широкую картину, я хотел бы предложить

  • движение метод сети в операцию и обработать его там, так как он больше продолжительность жизни, чем Фрагмент
  • использование Android Volley для обработки сетей. С его помощью вы можете управлять непреднамеренными многочисленными запросами на отправку данных на ваш сервер. Поскольку каждый запрос может быть прикреплен с помощью тега, вы можете отменить любой с определенным тегом в очереди (в вашем случае тот, который соответствует процессу sendDataToServer), прежде чем запускать новый.
  • и, наконец, использовать шаблон Publisher-Subsriber, который уже был предоставлен библиотеками, такими как Otto или EventBus. Это позволяет общаться между фрагментами или действиями, избегая проблем, связанных с жизненным циклом. В основе: издатель выдает события подписчикам, зарегистрированным на нем, и в отличие от слушателей, как издатель, так и подписчик полностью разделены. В вашем случае, когда sendDataToServer завершает работу, вы не будете знать, остается ли фрагмент, содержащий onTaskDone. Если этот метод управляет пользовательским интерфейсом, а фрагмент уничтожил его представление, вы обязательно получите сообщение об ошибке. Таким образом, onTaskDone должен быть обернут внутри метода подписчика, родительский фрагмент которого зарегистрирован в издателе событий http и отменен регистрацией, как только его представление будет уничтожено.
0

Тема будет продолжать работать до MyWelcomeFragment жив и если ты не убьешь его в onPause().

+0

Это неверно. Если не убит и все еще жив, поток будет продолжать работать даже после уничтожения фрагмента или активности. – inmyth

1

Он будет работать до тех пор, пока не будет выполнен метод run(), который, вероятно, длится долгое время, когда sendDataToServer ("") выполняется, поскольку обработчик должен быть довольно быстрым по сравнению с сетевым IO - или потоком прервана сила.

Вы по-прежнему интересуетесь результатом, если пользователь переключает фрагменты?

Поддерживаете ли вы ссылку на фрагмент приветствия? (Через менеджер фрагментов или активность) - если это так, вы можете получить доступ к результату.

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

+0

Когда задача завершается, результаты записываются в общий префикс, и счетчик обновляется. Это должно произойти только тогда, когда фрагмент активирован, поэтому его нет в основном действии. – justdan0227

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