『壹』 一個android Timer,為什麼只執行了一次
public void getPaisong() {
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1: {
// 初始化搜索模塊,注冊事件監聽
mSearch = new MKSearch();
mSearch.init(app.mBMapMan, new MyMKSearchListener());
jiexi();
cou++;
Toast.makeText(
BMapApiDemoApp.mDemoApp.getApplicationContext(),
"執行了"+cou+"一次!", Toast.LENGTH_LONG).show();
}
break;
}
super.handleMessage(msg);
}
};
TimerTask task = new TimerTask() {
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
timer = new Timer(true);
timer.schele(task, 5000); // 延時1000ms後執行,1000ms執行一次
// timer.cancel(); //退出計時器
}
我在oncreate方法里直接調用了getPaisong()方法,可是只顯示cou=1
『貳』 android中怎麼讓線程長時間休眠線程休眠最長的安全時間是多少
設定一個Timer對象,時間到後觸發事件再給handler發消息處理就行,處理完重置timer的時間進入下一個循環即可。隨便用wait之類的土辦法的話很容易被系統判定為進程掛死然後被kill掉的。
『叄』 Android怎麼正確使用wait和notify方法
synchronized(obj) {
while(!condition) {
obj.wait();
}
obj.doSomething();
}
當線程A獲得了obj鎖後,發現條件condition不滿足,無法繼續下一處理,於是線程A就wait() , 放棄對象鎖.
之後在另一線程B中,如果B更改了某些條件,使得線程A的condition條件滿足了,就可以喚醒線程A:
synchronized(obj) {
condition = true;
obj.notify();
}
需要注意的概念是:
# 調用obj的wait(), notify()方法前,必須獲得obj鎖,也就是必須寫在synchronized(obj) {…} 代碼段內。
# 調用obj.wait()後,線程A就釋放了obj的鎖,否則線程B無法獲得obj鎖,也就無法在synchronized(obj) {…} 代碼段內喚醒A。
# 當obj.wait()方法返回後,線程A需要再次獲得obj鎖,才能繼續執行。
# 如果A1,A2,A3都在obj.wait(),則B調用obj.notify()只能喚醒A1,A2,A3中的一個(具體哪一個由JVM決定)。
# obj.notifyAll()則能全部喚醒A1,A2,A3,但是要繼續執行obj.wait()的下一條語句,必須獲得obj鎖,因此,A1,A2,A3隻有一個有機會獲得鎖繼續執行,例如A1,其餘的需要等待A1釋放obj鎖之後才能繼續執行。
# 當B調用obj.notify/notifyAll的時候,B正持有obj鎖,因此,A1,A2,A3雖被喚醒,但是仍無法獲得obj鎖。直到B退出synchronized塊,釋放obj鎖後,A1,A2,A3中的一個才有機會獲得鎖繼續執行
『肆』 android用timer做定時任務,崩潰的原因
在做定時任務的時候,有的同學可能能會用到Timer這個定時任務的輔助類,
但是使用它會有潛在的風險,風險如下,
(1)時間計算不準確問題
因為Timer是以絕對時間計算定時任務的,會受到系統時間的影響,如果在任務執行期間,更改了系統時間,那麼會
導致時間計算不準確問題,導致任務沒用按找預定的時間執行。
(2)只能單任務執行
簡單講就是,只能一次執行一個任務,如果前一個任務沒有執行完成,後一個任務是無法並行執行的,只能等待前一個任務執行完成
才能執行。也有可能會出現這樣的結果,前一個任務執行的時間太長,後幾個任務時間短,可能在一個時間段內執行了多個任務,任務又
沒有按照我們要執行的時間執行。
(3)非檢查異常導致非同步任務終止
Timer當在執行的過程中遇到非檢查異常的時候,會導致本次任務失敗,並且接下來的任務也無法被執行,Timer將會終止執行,這不是
我們要的結果,我們需要一套恢復機制。
java5以後可以用下面的這個類來替代Time,並且解決了以上三個問題
java.util.concurrent.ScheledThreadPoolExecutor
那麼在Android上呢,可以用 java.util.concurrent.ScheledThreadPoolExecutor,也可以用Handler機製做,
但是不建議使用Timer
『伍』 求教為什麼Android Timer在後台運行,開始正常,但每次都不定時的突然結束了跪求,謝謝
應該是系統的內存的問題。