OK,基本原理已經了解了 , 現在我們來手搓一個AsyncTask
class DownloadTask extends AsyncTask {@Overrideprotected void onPreExecute() {//這里我們使用了一個顯示進度的Dialog,具體實現不表progressDialog.show();}@Overrideprotected Boolean doInBackground(Void... voids) {try {while (true){//調用我們的doDownload下載方法,具體實現不表int downloadPercent = doDownload();//使用publishProgress方法來更新執行的進度publishProgress(downloadPercent);if (downloadPercent >= 100)break;}} catch (Exception e) {e.printStackTrace();}return true;}@Overrideprotected void onProgressUpdate(Integer... values) {//更新下載進度progressDialog.setMessage("Download " values[0] "%");}@Overrideprotected void onPostExecute(Boolean aBoolean) {//下載完成progressDialog.dismiss();}}這里我們創建了一個Download類繼承自AsyncTask , 有三個泛型,void表示不需要給后臺任務傳入參數,Integer表示用整數類型來作為進度顯示的單位,Boolean表示用布爾類型來反饋后臺任務的執行結果 。
要讓我們的這個AsyncTask跑起來也很簡單,只需要執行:
new DownloadTask().execute();
2.5 IntentService
IntentService是一種特殊的Service , 它繼承了Service并且是一個抽象類,我們可以創建它的子類來使用 。IntentService也可以用于執行后臺的耗時任務,并且當任務執行完畢之后它會自動停止 。
IntentService因為是服務的原因,所以和單純的線程相比它的優先級要高很多,從而更不容易被系統殺死 。
IntentService的內部實現是封裝了HandlerThread和Handler,使用的話要遵循Service的使用方法,這里先略過后面有機會在Service的專欄里面再詳細介紹 。
2.6 RxJava
有杠精可能會說,你講的這些方法,一個比一個長,一個比一個復雜,就不能整個簡單又粗暴的東西?
這個時候就需要祭出神兵利器RxJava了 。
2.6.1 RxJava又是個啥?其實網絡上RxJava的入門文章多如過江之鯽,這里不打算過多的深入介紹 。RxJava是一種響應式編程,大家不是很明白的話可以粗暴的理解為更優雅的多線程實現即可 。
2.6.2 那怎么操作RxJava?先手搓一個RxJava的普通實現方式
private void fun(){Observable observable = Observable.create(new ObservableOnSubscribe() {@Overridepublic void subscribe(ObservableEmitter emitter) throws Exception {emitter.onNext(1);}});observable.subscribeOn(Schedulers.io()) //表示在io線程執行訂閱.observeOn(AndroidSchedulers.mainThread()) //表示在主線程接收訂閱.subscribe(new Observer() {@Overridepublic void onSubscribe(Disposable d) {//接收訂閱之前調用}@Overridepublic void onNext(Integer integer) {//接收訂閱成功調用doSomething();}@Overridepublic void onError(Throwable e) {//接收訂閱出錯調用}@Overridepublic void onComplete() {//接收訂閱完成調用}});}emmmmm看起來好像還是挺復雜的啊,能不能再整簡單點?
OK , 鏈式調用加lambda安排上
private void fun() {Observable.create(emitter -> emitter.onNext(1)).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(integer -> {//接收訂閱成功doSomething();}, throwable -> {});}嗯......有內味了 。
這串代碼我們是發送了一個Integer類型的數據;
subscribeOn()指定了我們發送的線程是在后臺的io線程,就可以理解為一個子線程;
observeOn指定了我們接收的線程為主線程;
subscribe只接收成功的消息 , 相當于上面的OnNext()方法,本質上是我們在這里創建了一個Comsumer對象來接收;
throwable在接收失敗的時候調用,相當于上面的onError()方法 。
RxJava有多達幾十種的操作符,靈活運用能實現各種不同的異步任務,這里就不再花大量的篇幅詳細介紹了 , 有興趣的朋友可以去查看ReactiveX中文文檔
- “海馬體”長度不到10厘米 竟能偷走人類的記憶力
- 科學家揭秘:人類基因是肢體再生的關鍵
- 娜迦毒蛇,不是蛇而是世界上最辣的辣椒
- 世界最強十大航母:美航母還能領先多少年?
- 地球上的生物為何要依賴氧氣生存?氧氣是怎么產生的
- 大腦的奧秘,科學揭秘人類大腦如何一心二用!
- 破解挑戰者號背后的五大驚天謎團?
- 形容自己再做也得不到重視的成語
- 形容一次又一次的發生的成語
- 形容聲音吵很煩躁的成語
