#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» для примеров.
Вероятно, есть и другие причины, но сейчас они у меня в голове. И, конечно, это мое мнение.