Intereting Posts
Android: пользовательское уведомление о Toast Inherit Default Toast Хороший способ получить местоположение пользователя в Android Android: удаление изображения Нужно ли нам потреблять поток ошибок HttpURLConnection при выходе IOException Ошибка установки на Android Gingerbread и Froyo – INSTALL_FAILED_DEXOPT Использовать офлайн-голос в текст в Android 4.1 (Jelly Bean) из моего приложения? Как предотвратить закрытие диалогового окна при нажатии кнопки Android – могу ли я передать параметр при запуске других приложений из моего приложения? MapView onCreate выбрасывает NullPointerException на устройствах LG Отправка SMS на Android Как установить высоту вкладок панели действий для Android Кнопка запуска отключена в Android Studio Android-версия Неподдерживаемая версия плагина Gradle Продолжайте запускать приложение после автоматического блокировки экрана – Phonegap (Android / iOS) Затухание границы изображения в изображении

Фрагменты и темы в Android

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

Функция onCreate of MainActivity завершает работу onCreate с использованием

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

Как часть MyWelcomeFragment on 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(); 

Solutions Collecting From Web of "Фрагменты и темы в Android"

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

В более широкой картине я бы предложил

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

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

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

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

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

Thread будет продолжать работать до MyWelcomeFragment пор, пока MyWelcomeFragment будет MyWelcomeFragment и если вы не убьете его в onPause() .