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在IntentService的onHandleIntent方法中不起作用

具有此代碼的類擴展IntentService,這會是一個問題嗎?

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

更新: 我把這個代碼在擴展IntentService類。我發現它的唯一工作是在構造函數中。但我需要把它放在onHandleIntent方法中。所以,我檢查了文檔onHandleIntent,它說:

該方法被調用的工作線程上的請求process.Only一個意圖在同一時間被處理,但在運行工作線程的處理情況獨立於其他應用程序邏輯。所以,如果這段代碼需要很長時間,它會阻止對同一個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

處理程序和服務是可以預測的,當設備屏幕上。 如果設備進入睡眠狀態,例如Handler將不是一個可行的解決方案。

一個更加美好和可靠的解決方案將使用: 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();

相關問題