1
final Handler handler = new Handler(); 
LOG.d("delay"); 
handler.postDelayed(new Runnable() { 
    @Override public void run() { 
     LOG.d("notify!"); 
     //calling some methods here 
    } 
}, 2000); 

«Задержка» показывает в журнале, но не другие. И метод, вызванный в run(), также не называется. Кто-нибудь может объяснить, почему это происходит, я делаю что-то неправильно?handler.postDelayed не работает в onHandleIntent метод IntentService

Класс, который имеет этот код, расширяет IntentService, будет ли это проблемой?

============================

UPDATE: я ставлю этот код в класс, расширяющий IntentService. Единственное место, где я нашел, это было в конструкторе. Но мне нужно положить его в метод onHandleIntent. Поэтому я проверил документацию для onHandleIntent и он сказал:

Этот метод вызывается на рабочем потоке с просьбой process.Only один Intent обрабатывается в то время, но обработка происходит на рабочем потоке, который работает независимо от другой прикладной логики. Таким образом, если этот код занимает много времени, он будет задерживать другие запросы к одному и тому же IntentService, но он ничего не задержит. Когда все запросы обрабатываются, IntentService останавливается, поэтому вы не должны называть stopSelf.

Так что, основываясь на полученном результате, я чувствую, что не могу использовать postDelayed в «рабочей нить». Но может ли кто-нибудь объяснить это немного больше, например, почему это не работает в рабочем потоке? Заранее спасибо.

+0

является импорт из 'os.Handler'? –

+0

@NJ да есть. android.os.Handler – Zip

+0

Где вы это называете? Нужен контекст. – Nathanael

ответ

0

это, как я использовать обработчик:

import android.os.Handler; 

Handler handler; 
//initialize handler 
handler = new Handler(); 

//to start handler 
handler.post(runnableName); 

private Runnable runnableName= new Runnable() { 
     @Override 
     public void run() { 
      //call function, do something 
      handler.postDelayed(runnableName, delay);//this is the line that makes a runnable repeat itself 
     } 
}; 
+0

Спасибо за ответ, но он не работает. Я не знаю, может ли это потому, что я не могу поместить этого парня в какие-то потоки или что-то еще. – Zip

0

Обработчики и услуги будут предсказуемы, когда экран устройства включен. Если устройства засыпают, например, обработчик не будет жизнеспособным решением.

Гораздо лучше и надежным решением будет использовать: AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

+0

нет, если вы пытаетесь задержать, скажем, несколько секунд –

+0

У вас есть ссылка на это заявление? Я спрашиваю, так как мой обработчик работает непредсказуемо после ок. 15 минут выключения экрана – galaxigirl

0

IntentService не предназначен для такого сценария. Вместо этого вы можете использовать обычный Service. Вы можете поместить обработчик внутри onStartCommand(). Не забудьте, чтобы звонил stopSelf() в Службе, чтобы отключить его после handler.postDelayed(){}

0

Есть ли у вас «LOG.d (« »)? Если вы будете использовать Log.d ("", ""), вам нужно передать два аргумента.

0

Преобразовать

final Handler handler = new Handler(); 

в

final Handler handler = new Handler(Looper.getMainLooper()); 

Это работает для меня.

+0

Это не повлияет, если вы создаете обработчик в основном потоке. – CopsOnRoad

1

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

HandlerThread handlerThread = new HandlerThread("background-thread"); 
handlerThread.start(); 
final Handler handler = new Handler(handlerThread.getLooper()); 
handler.postDelayed(new Runnable() { 
    @Override public void run() { 
     LOG.d("notify!"); 
     // calling some methods here 

     // make sure to finish the thread to avoid leaking 
     handlerThread.quitSafely(); 
    } 
}, 2000); 

Или вы можете использовать Thread.sleep (long millis).

try { 
    Thread.sleep(2000); 
    // calling some methods here 
catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

Если вы хотите, чтобы остановить спящую нить, используйте yourThread.interrupt();

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

  • Нет связанных вопросов^_^