Я хочу, чтобы какой-то код работал в фоновом режиме постоянно. Я не хочу делать это в сервисе. Возможен ли другой способ?
Я попытался вызвать Thread
класс в моем, Activity
но мое время Activity
остается в фоновом режиме, а затем он останавливается. Thread
Класс также перестает работать.
class testThread implements Runnable {
@Override
public void run() {
File file = new File( Environment.getExternalStorageDirectory(), "/BPCLTracker/gpsdata.txt" );
int i = 0;
RandomAccessFile in = null;
try {
in = new RandomAccessFile( file, "rw" );
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//String line =null;
while ( true ) {
HttpEntity entity = null;
try {
if ( isInternetOn() ) {
while ( ( line = in.readLine() ) != null ) {
HttpClient client = new DefaultHttpClient();
String url = "some url";
HttpPost request = new HttpPost( url );
StringEntity se = new StringEntity( line );
se.setContentEncoding( "UTF-8" );
se.setContentEncoding( new BasicHeader( HTTP.CONTENT_TYPE, "application/json" ) );
entity = se;
request.setEntity( entity );
HttpResponse response = client.execute( request );
entity = response.getEntity();
i++;
}
if ( ( line = in.readLine() ) == null && entity != null ) {
file.delete();
testThread t = new testThread();
Thread t1 = new Thread( t );
t1.start();
}
} else {
Thread.sleep( 60000 );
} // end of else
} catch (NullPointerException e1) {
e1.printStackTrace();
} catch (InterruptedException e2) {
e2.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}// end of while
}// end of run
}
android
multithreading
user2082987
источник
источник
runOnUiThread()
метода.Ответы:
Если вам нужно:
выполнить код в фоновом потоке
выполнить код, который НЕ касается / не обновляет пользовательский интерфейс
выполнить (короткий) код, выполнение которого займет не более нескольких секунд
ЗАТЕМ используйте следующий чистый и эффективный шаблон, который использует AsyncTask:
источник
Помните, что «Запуск в фоновом режиме» и «Постоянный запуск» - это две разные задачи.
Для длительных фоновых процессов потоки не оптимальны для Android. Однако вот код и делайте это на свой страх и риск ...
Помните, что служба или поток будут работать в фоновом режиме, но наша задача должна запускать триггер (вызывать снова и снова), чтобы получать обновления, то есть после завершения задачи нам нужно вызвать функцию для следующего обновления.
Таймер (периодический триггер), Будильник (триггер по временной шкале), Трансляция (Триггер по событию), рекурсия разбудят наши функции.
Использование службы: если вы запустите службу, она запустится, она выполнит задачу и завершится сама собой. после выполнения задания. Прекращение может также быть вызвано исключением, или пользователь убил его вручную из настроек. START_STICKY (Sticky Service) - это опция, предоставляемая android, при которой служба перезапускается, если служба прекращается.
Помните вопрос о разнице между многопроцессорностью и многопоточностью? Служба - это фоновый процесс (точно так же, как активность без пользовательского интерфейса). Так же, как вы запускаете поток в действии, чтобы избежать нагрузки на основной поток (поток активности), точно так же, как вам нужно запускать потоки (или асинхронные задачи) в службе чтобы избежать нагрузки на сервис.
В одном операторе, если вы хотите запустить фоновую задачу продолжения, вам необходимо запустить StickyService и запустить поток в службе на основе событий
источник
Скорее всего механизм, который вы ищете, есть
AsyncTask
. Он непосредственно предназначен для выполнения фонового процесса в фоновом потоке. Также его основным преимуществом является то, что он предлагает несколько методов, которые работают в основном (UI) потоке и позволяют обновлять ваш пользовательский интерфейс, если вы хотите сообщить пользователю о каком-то прогрессе в задаче или обновить пользовательский интерфейс данными, полученными из фонового процесса.Если вы не знаете, с чего начать, вот хороший урок:
Примечание: также есть возможность использовать
IntentService
сResultReceiver
этим тоже работает.источник
Простой 3-слойный
Простой способ сделать это, который я нашел в комментарии @awardak в ответе Брэндона Руда :
Я не уверен, лучше ли это и как это использовать,
AsyncTask.execute
но, похоже, у нас это работает. Будем признательны за любые комментарии относительно разницы.Спасибо, @awardak !
источник
Альтернативой AsyncTask является robospice. https://github.com/octo-online/robospice .
Некоторые особенности robospice.
1. выполняет асинхронно (в фоновом режиме AndroidService) сетевые запросы (например, запросы REST с использованием Spring Android). Уведомляет ваше приложение в потоке пользовательского интерфейса, когда результат будет готов.
2. строго типизирован! Вы делаете свои запросы с помощью POJO и получаете POJO в качестве результатов запроса.
3. не применять никаких ограничений ни для POJO, используемых для запросов, ни для классов Activity, которые вы используете в своих проектах.
4. кэширует результаты (в Json и с Jackson и Gson, или с Xml, или с плоскими текстовыми файлами, или с двоичными файлами, даже с использованием ORM Lite).
5. уведомляет ваши действия (или любой другой контекст) о результате сетевого запроса, если и только если они все еще живы
6. вообще нет утечки памяти, как Android Loaders, в отличие от Android AsyncTasks уведомляет о ваших действиях в своем потоке пользовательского интерфейса.
7. использует простую, но надежную модель обработки исключений.
Образцы для начала. https://github.com/octo-online/RoboSpice-samples .
Образец robospice на https://play.google.com/store/apps/details?id=com.octo.android.robospice.motivations&feature=search_result .
источник
источник
Если вам нужно предварительно запустить поток с разными кодами, вот пример:
Слушатель:
Класс потока
Запускаем разные коды:
источник