Остановить поток, загружающий изображения, когда действие завершается

#android #multithreading #image #download

#Android #многопоточность #изображение #Скачать

Вопрос:

В моем приложении действие запускает поток, который загружает изображения с сервера. Существует более 30 изображений. Во время загрузки пользователь может переключиться на другое действие. Поэтому я хочу, чтобы поток прекратил делать все, что он делает. Я использовал метод mThread.interrupt() в onDestroy(), но он не сработал. Как это сделать?

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

1. в вашем случае я предлагаю использовать сервисы

Ответ №1:

Я могу предложить более простой и безопасный подход к решению этой проблемы

Используйте общее значение для вашего приложения; SharedPreferences или внутри контекста приложения Key=Значение IsStopDownload= True / False

часть.1) в контексте приложения (MyApplication)

 private boolean isAppActive = false;
public void setAppState(Context context, boolean state) {
    isAppActive = state;
    // note: you can also store this in SharedPreferences
}
public boolean getAppState(Context context) {
    return isAppActive;
    // note: you can also load this from SharedPreferences
}
  

часть.2)
Activity onResume и onPause — это гарантированные места для определения состояния вашей активности.

onResume -> активность активна onPause -> активность не активна

часть.3) пусть ваш поток проверяет состояние активности, и если он не активен, он может остановиться сам, это безопаснее, чем делать внешнее прерывание. потоки могут вести себя странно, когда прерываются извне, безопаснее разорвать цикл изнутри.

например

 ((MyApplication)context.getApplicationContext()).getAppState(context);
  

если это значение равно false, поток останавливается сам

надеюсь, это поможет…


Социальное кодирование @AspiroTV

Ответ №2:

Когда пользователь переключит действие, это действие не будет уничтожено, а приостановлено, поэтому попытка вашего кода is onPause() может сработать.

Ответ №3:

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

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

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

  • Службу не нужно останавливать, потому что действие прекращается.
  • Сервисы очень просты и быстры в реализации. И код уведомления о завершении также прост.
  • Вы загружаете изображения, и всегда лучше выполнить работу сразу, если это возможно, чтобы сэкономить пропускную способность и время подключения для пользователя и кэшировать изображения локально. Раньше это было хуже, потому что сегодня сотовые телефоны являются полноценными компьютерами. Но всегда важно кодировать для повышения эффективности. Поэтому, ИМХО, вы должны поддерживать потребность в соединении как можно меньше / быстрее.
  • Наконец, даже использование AsyncTask s внутри действия требует сложного (простого, но все же сложного) кода для перехвата и отключения задачи, когда действие прекращается, и проверки на наличие нулей, когда оно возвращается. Поскольку вы загружаете изображения, и это может занять некоторое время, и очень возможно, что пользователь может потребовать изменения ориентации (перевести устройство в альбомную ориентацию), вам это понадобится. Найдите в stackoverflow «изменение ориентации asynctask» для примеров.

Вероятно, есть и другие причины, но сейчас они у меня в голове. И, конечно, это мое мнение.