日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android之多线程工作-AsyncTask与handler

發布時間:2025/5/22 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之多线程工作-AsyncTask与handler 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要講解下AsyncTask的使用以及Handler的應用

首先,我們得明確下一個概念,什么是UI線程。顧名思義,ui線程就是管理著用戶界面的那個線程!

android的ui線程操作并不是安全的,并且和用戶直接進行界面交互的操作都必須在ui線程中進行才可以。這種模式叫做單線程模式。

我們在單線程模式下編程一定要注意:不要阻塞ui線程、確保只在ui線程中訪問ui組件

當我們要執行一個復雜耗時的算法并且最終要將計算結果反映到ui上時,我們會發現,我們根本沒辦法同時保證上面的兩點要求;我們肯定會想到開啟一個新的線程,讓這個復雜耗時的任務到后臺去執行,但是執行完畢了呢?我們發現,我們無法再與ui進行交互了。

為了解決這種情況,android為我們提供了很多辦法。

1)、handler和message機制:通過顯示的拋出、捕獲消息與ui進行交互;

2)、Activity.runOnUiThread(Runnable):如果當前線程為ui線程,則立即執行;否則,將參數中的線程操作放入到ui線程的事件隊列中,等待執行。

3)、View.post(Runnable):將操作放入到message隊列中,如果放入成功,該操作將會在ui線程中執行,并返回true,否則返回false

4)、View.postDelayed(Runnable, long)跟第三條基本一樣,只不過添加了一個延遲時間。

5)、android1.5以后為我們提供了一個工具類來搞定這個問題AsyncTask.

AsyncTask是抽象類,定義了三種泛型類型 Params,Progress,Result。

Params 啟動任務執行的輸入參數,比如HTTP請求的URL

Progress 后臺任務執行的百分比。

Result 后臺執行任務最終返回的結果,比如String

用程序調用,開發者需要做的就是實現這些方法。

1) 子類化AsyncTask

2) 實現AsyncTask中定義的下面一個或幾個方法

onPreExecute(),該方法將在執行實際的后臺操作前被UI thread調用。可以在該方法中做一些準備工作,如在界面上顯示一個進度條。

doInBackground(Params…),將在onPreExecute 方法執行后馬上執行,該方法運行在后臺線程中。這里將主要負責執行那些很耗時的后臺計算工作。可以調用 publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。

onProgressUpdate(Progress…),在publishProgress方法被調用后,UI thread將調用這個方法從而在界面上展示任務的進展情況,例如通過一個進度條進行展示。

onPostExecute(Result),在doInBackground 執行完成后,onPostExecute 方法將被UI thread調用,后臺的計算結果將通過該方法傳遞到UI thread.

為了正確的使用AsyncTask類,以下是幾條必須遵守的準則:

1) Task的實例必須在UI thread中創建

2) execute方法必須在UI thread中調用

3) 不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)這幾個方法

4) 該task只能被執行一次,否則多次調用時將會出現異常

package cn.com.chenzheng_java; import android.os.AsyncTask; /** * * @author chenzheng_java * @description 異步任務AcyncTask示例 * */ public class MyAsyncTask extends AsyncTask<String, Integer, Object> { /** * 該方法由ui線程進行調用,用戶可以在這里盡情的訪問ui組件。 * 很多時候,我們會在這里顯示一個進度條啥的,以示后臺正在 * 執行某項功能。 */ @Override protected void onPreExecute() { super.onPreExecute(); } /** * 該方法由后臺進程進行調用,進行主要的耗時的那些計算。 * 該方法在onPreExecute方法之后進行調用。當然在執行過程中 * 我們可以每隔多少秒就調用一次publishProgress方法,更新 * 進度信息 */ @Override protected Object doInBackground(String... params) { return null; } /** * doInBackground中調用了publishProgress之后,ui線程就會 * 調用該方法。你可以在這里動態的改變進度條的進度,讓用戶知道 * 當前的進度。 */ @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } /** * 當doInBackground執行完畢之后,由ui線程調用。可以在這里 * 返回我們計算的最終結果給用戶。 */ @Override protected void onPostExecute(Object result) { super.onPostExecute(result); } }


下面介紹最本質的多線程:hanlder和message機制:

為何需要多線程:

在日常應用中,我們通常需要處理一些“后臺,用戶不可見”的操作,例如說,我們需要下載一個音樂,要是你的應用必須等用戶下載完成之后才可以進行別的操作,那肯定讓用戶非常的不爽。這時候,我們通常的做法是,讓這些操作去后臺執行,然后等后臺執行完畢之后,再給用戶彈出相應的提示信息。這時候,我們就需要使用多線程機制,然后通過創建一個新的線程來執行這些操作。

明白了,實現需求,我們就準備著手實現了。但是,經過進一步的了解,我們悲劇的發現,android中的線程機制是,只能在UI線程中和用戶進行交互。當我們創建了一個新線程,執行了一些后臺操作,執行完成之后,我們想要給用戶彈出對話框以確認,但是卻悲劇的發現,我們根本無法返回UI主線程了。

(說明:何為UI線程:UI線程就是你當前看到的這些交互界面所屬的線程)。

這時候,我們如果想要實現這些功能,我們就需要一個android為我們提供的handler和message機制。

先講解下編程機制:

我們通常在UI線程中創建一個handler,handler相當于一個處理器,它主要負責處理和綁定到該handler的線程中的message。每一個handler都必須關聯一個looper,并且兩者是一一對應的,注意,這點很重要哦!此外,looper負責從其內部的messageQueue中拿出一個個的message給handler進行處理。因為我們這里handler是在UI線程中實現的,所以經過這么一個handler、message機制,我們就可以回到UI線程中了。

何為handler:處理后臺進程返回數據的工作人員。

何為message:后臺進程返回的數據,里面可以存儲bundle等數據格式

何為messageQueue:是線程對應looper的一部分,負責存儲從后臺進程中拋回的和當前handler綁定的message,是一個隊列。

何為looper:looper相當于一個messageQueue的管理人員,它會不停的循環的遍歷隊列,然后將符合條件的message一個個的拿出來交給handler進行處理。

注意,handler是在UI線程中聲明的,如果我們直接用類似代碼執行一個線程的話,實際上并沒有創建一個新的線程,因為handler已經跟默認的UI線程中的looper綁定了。

如果有興趣的話,可以去看下Handler的默認空構造函數便知道原因了,里面直接綁定了當前UI線程的looper。

下面給出一個比較簡單,并且實用的實例。

package cn.com.src; import cn.com.chenzheng_java.utils.R; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /** * @author chenzheng_java * handler和message測試用例 */ public class HanlderMessageTest extends Activity implements OnClickListener{ Button button ; MyHandler handler ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button = (Button) this.findViewById(R.id.button1); button.setOnClickListener(this); } // 聲明自己的handler private class MyHandler extends Handler{ /** * 使用默認的構造函數,會將handler綁定當前UI線程的looper。 * 如果想使用多線程這里是不能使用默認的構造方法的。 */ public MyHandler() { super(); } public MyHandler(Looper looper){ super(looper); } // 處理具體的message,該方法由父類中進行繼承. @Override public void handleMessage(Message msg) { int whatNumber = msg.what; Bundle bundle = (Bundle)msg.obj; Log.i("what", whatNumber+""); Log.i("名稱", bundle.getString("name")); Log.i("性別", bundle.getString("sex")); Log.i("年齡", bundle.getString("age")); super.handleMessage(msg); } } // 我自定義的任務,一般都會實現Runnable private class MyThread implements Runnable { /** * 該方法的內部進行具體的任務實現,比如 下載. * Message中包含著想和ui線程交互的數據,原則上,在線程內部是 * 最好不要直接調用handler的。 * */ @Override public void run() { try { Thread.sleep(6000); Message message = Message.obtain(handler); message.what = 10 ; Bundle bundle = new Bundle(); bundle.putString("name", "chenzheng"); bundle.putString("sex", "純爺們"); bundle.putString("age", "生卒年不詳"); message.obj = bundle ; Log.i("通知", "開始發message了哦"); Log.i("通知thread_id:", ""+Thread.currentThread().getId()); message.sendToTarget(); } catch (Exception e) { Log.i("通知", "線程sleep時出錯了!"); e.printStackTrace(); } } } @Override public void onClick(View v) { Log.i("通知thread_id:", ""+Thread.currentThread().getId()); // 創建一個包含Looper的線程,這里如果沒有HandlerThread的調用,會直接將后邊的MyThread放到UI線程隊列 HandlerThread myHandlerThread = new HandlerThread("chenzheng_java"); // 啟動新線程 myHandlerThread.start(); // 將handler綁定到新線程 handler = new MyHandler(myHandlerThread.getLooper()); // 在新線程中執行任務 handler.post(new MyThread()); } }


轉載聲明: 本文轉自

Android之多線程工作-AsyncTask與handler

Android自用-----AsyncTask實現異步處理任務

android線程 Handler Message Queue AsyncTask

總結

以上是生活随笔為你收集整理的Android之多线程工作-AsyncTask与handler的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国内精品久久99人妻无码 | 天天操夜夜操 | 国产女人18水真多18精品一级做 | 亚洲精品第三页 | 91麻豆国产在线观看 | 善良的老师伦理bd中字 | 欧美日韩不卡合集视频 | 欧美大黄视频 | 麻豆传媒在线 | 日韩经典中文字幕 | 亚洲男女在线观看 | 欧美自拍视频 | 日日干日日射 | 国产天堂视频 | 久久9久久| 在线观看中文字幕 | 亚洲一区二区国产精品 | 久久国产精品网 | 免费在线成人网 | 污污的网站在线免费观看 | 奇米网一区二区 | 国产一区二区激情视频 | 欧美成人天堂 | 日本国产三级xxxxxx | 亚洲精品xxxxx| 兔费看少妇性l交大片免费 日韩高清不卡 | av网址有哪些| 国产欧美一区二区三区在线老狼 | 国产成人久久精品流白浆 | 好av| 久久午夜鲁丝 | 91女人18毛片水多国产 | 国产激情啪啪 | 国产福利一区二区三区在线观看 | 亚洲精品推荐 | 亚洲卡一 | 一级片黄色 | 熟女人妻一区二区三区免费看 | 请用你的手指扰乱我吧 | 国产视频中文字幕 | 午夜免费体验区 | 欧美少妇毛茸茸 | 日本中文字幕在线播放 | 69综合| wwwxxx黄色片 | 亚洲porn| 日本视频在线免费 | 视频免费观看在线 | 精品国产自 | 无码精品一区二区三区在线播放 | 国产精品入口日韩视频大尺度 | 一区二区三区久久久久 | 国产又黄又粗又猛又爽 | 1区2区3区在线观看 久久久久久久久久久影院 成人网址在线观看 | 九九九免费视频 | 宿舍女女闺蜜调教羞辱 | 亚洲欧洲精品一区二区 | 亚洲视频网站在线观看 | 亚洲精品国产精品国自产在线 | 成人午夜福利一区二区 | 亚洲国产精品区 | 久久综合亚洲 | 日日操夜夜操狠狠操 | 无码人妻丰满熟妇精品区 | 蜜桃成人无码区免费视频网站 | 国产a一级 | 成年视频在线观看 | 欧美成人综合 | 激情五月婷婷在线 | 亚洲瑟瑟| 成人区人妻精品一熟女 | 免费www xxx | 精品久久久久久无码中文野结衣 | 亚洲国产日韩一区 | 亚洲av成人精品毛片 | 亚洲制服在线观看 | 久久精品蜜桃 | 污片网站在线观看 | 亚洲色图狠狠干 | 白丝美女被草 | 99精品色| 伊人国产在线 | 国产婷婷综合 | 欧美久久99 | 欧美老司机 | heyzo朝桐光一区二区 | 日韩在线精品强乱中文字幕 | 美国一区二区三区 | 女仆裸体打屁屁羞羞免费 | 亚洲一级影片 | 噜噜噜久久| 91视频导航 | 日韩有码中文字幕在线观看 | 亚洲资源网站 | 精品国产乱码久久久久久久软件 | 2020av在线 | 欧美精品在线一区二区三区 | 国产精品自拍电影 | 天天爱综合 |