執行緒方法Android 非同步呼叫詳解

2021-09-06 09:51:34 字數 3446 閱讀 4527

ps:今天上午,非常鬱悶,有很多簡單基礎的問題搞得我有些迷茫,哎,**幾天不寫就忘。目前又不當coo,還是得用心記**哦!

在現實應用中經常會碰到比較耗時任務的處理,比如網路連線,資料庫操作等情況時,如果這些操作都是放在主線程(ui執行緒)中,則會形成ui的假死景象,android中可以應用

asynctask和handler

兩種非同步方式來解決這類問題。

asynctask:

android提供的輕量級的非同步類,可以直接繼承asynctask,在類中實現非同步操作,並提供介面反饋當前非同步執行的水平(可以通過介面實現ui進度更新),最後反饋執行的結果給ui主線程.

應用的長處:

簡單,快捷,程序可控

應用的缺點:

在應用多個非同步操作和並須要進行ui變革時,就變得複雜起來.

在應用asynctask時處理類須要繼承asynctask,提供三個泛型引數,並且過載asynctask的四個方法(至少過載乙個)。

三個泛型引數:

1.param 任務執行器須要的資料型別

2.progress 後台盤算中應用的進度單位資料型別

3.result 後台盤算返回結果的資料型別

在設定引數時通常是這樣的:string... params,這表示方法可以有0個或多個此型別引數;有時引數可以設定為不應用,用void...便可。

四個方法:

1.onpreexecute()

執行預處理,它執行於ui執行緒,可以為後台任務做一些準備工作,比如繪製乙個進度條控制項。

2.doinbackground(params...)

後台程序執行的具體盤算在這裡實現,doinbackground(params...)是asynctask的癥結,此方法必須過載。在這個方法內可以應用publishprogress(progress...)改變當前的進度值。

3.onprogressupdate(progress...)

執行於ui執行緒。如果在doinbackground(params...) 中應用了publishprogress(progress...),就會觸發這個方法。在這裡可以對進度條控制項根據進度值做出具體的響應。

4.onpostexecute(result)

執行於ui執行緒,可以對後台任務的結果做出處理,結果就是doinbackground(params...)的返回值。此方法也要經常過載,如果result為null表明後台任務沒有完成(被取消或者出現異常)。

非同步任務類**:

class downimagetask extends asynctask

// 後台程序的執行

@override

protected bitmap doinbackground(string... params)

inputstream.close();

} catch (exception e)

return bitmap;

} // 執行於ui執行緒,對後台任務的結果做出處理,doinbackground方法執行的結果作為此方法的引數

@override

protected void onpostexecute(bitmap result)

// 執行於ui執行緒,如果在doinbackground(params...)中應用了publishprogress(progress...),就會觸發此方法

@override

protected void onprogressupdate(integer... values) }

每日一道理

即使青春是一枝嬌豔的花,但我明白,一枝獨放永遠不是春天,春天該是萬紫千紅的世界。 即使青春是一株大地偉岸的樹,但我明白,一株獨秀永遠不是挺拔,成行成排的林木,才是遮風擋沙的綠色長城。即使青春是一葉大海孤高的帆,但我明白,一葉孤帆很難遠航,千帆競發才是大海的壯觀。

呼叫**:

public class mainactivity extends activity   

});}

handler:

handler可以分發message物件和runnable物件到主線程中, 每個handler例項,都市繫結到建立他的執行緒中(一般是位於主線程中)

兩個作用: 

布置訊息或runnable 在某個主線程中某個地方執行

布置乙個動作在不同的執行緒中執行

handler平分發訊息的方法:

post(runnable)

postattime(runnable,long)

postdelayed(runnable,long)

sendemptymessage(int)

sendmessage(message)

sendmessageattime(message,long)

sendmessagedelayed(message,long)

*以上post掃尾的方法在主線程中呼叫。

*以上send掃尾的方法在其它執行緒中呼叫。

示例**:

public class handlertestactivity extends activity 

handler handler = new handler() else }};

runnable thread = new runnable()

};class startlistener implements onclicklistener

}}

這個程式看上去彷彿實現了handler的非同步機制, handler.post(thread)彷彿實現了新啟執行緒的作用,不過通過執行我們發明,兩個執行緒的id相同!也就是說,現實上thread還是本來 的主線程,由此可見,handler.post()方法並未真正新建執行緒,只是在原執行緒上執行而已,我們並未實現非同步機制。將startlistener改寫成如下**就能夠實現非同步:

class startlistener implements onclicklistener 

}

將runnable放到新建立的執行緒中執行,這樣就實現了非同步呼叫,如果須要在呼叫完成後通知或修改主線程,須要在runnable類的run方法中呼叫handler.sendmessage(message)

@override

public void run()

文章結束給大家分享下程式設計師的一些笑話語錄: 人腦與電腦的相同點和不同點,人腦會記憶數字,電腦也會記憶數字;人腦會記憶程式,電腦也會記憶程式,但是人腦具有感知能力,這種能力電腦無法模仿,人的記憶會影響到人做任何事情,但是電腦只有程式軟體。比爾還表示,人腦與電腦之間最重要的乙個差別就是潛意識。對於人腦儲存記憶的特別之處,比爾表示,人腦並不大,但是人腦重要的功能是聯絡,人腦會把同樣的記憶儲存在不同的地方,因此記憶讀取的速度就不相同,而這種速度取決於使用的頻率和知識的重要性。人腦的記憶儲存能力會隨著年齡增長而退化,同時記憶的質量也會隨著年齡退化。經典語錄網

php 非同步呼叫方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!php 非同步呼叫方法 客戶端與伺服器端是通過http協議進行連線通訊,客戶端發起請求,伺服器端接收到請求後執行處理,並返回處理結果。有時伺服器需要執行很耗時的操作,這個操作的結果並不需要返回給客戶端。但因為php是同步執行的,所以客戶端需要等待服...

非同步呼叫和多執行緒呼叫

同步方法和非同步方法的區別 同步方法呼叫在程式繼續執行之前需要等待同步方法執行完畢返回結果 非同步方法則在被呼叫之後立即返回以便程式在被呼叫方法完成其任務的同時執行其它操作 現在新建乙個windows應用程式,然後放上乙個button1,寫入以下 c code private void button...

執行緒 委託的非同步呼叫

c programming p323 begininvoke 會立即返回,它將建立乙個另乙個執行緒來完成自己的工作。當我需要它執行後的結果時 例如 pubilc delegate in testdetegate pubilc testdetegate thedetegate thedetegate ...