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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android开发之Handler

發(fā)布時(shí)間:2023/12/9 Android 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android开发之Handler 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Handler 定義與作用

主要接受子線程發(fā)送的數(shù)據(jù), 并用此數(shù)據(jù)配合主線程更新UI。

解釋:當(dāng)應(yīng)用程序啟動(dòng)時(shí),Android 首先會(huì)開啟一個(gè)主線程(也就是UI線程),主線程為管理界面中的UI控件,進(jìn)行事件分發(fā),比如說,你要是點(diǎn)擊一個(gè) Button,Android 會(huì)分發(fā)事件到 Button 上,來響應(yīng)你的操作。如果此時(shí)需要一個(gè)耗時(shí)的操作,例如: 聯(lián)網(wǎng)讀取數(shù)據(jù),或者讀取本地較大的一個(gè)文件的時(shí)候,如果這些操作放在主線程中,界面會(huì)出現(xiàn)假死現(xiàn)象,如果5秒鐘還沒有完成的話,會(huì)收到 Android 系統(tǒng)的一個(gè)錯(cuò)誤提示 "強(qiáng)制關(guān)閉"。這個(gè)時(shí)候我們需要把這些耗時(shí)的操作,放在一個(gè)子線程中,因?yàn)樽泳€程涉及到UI更新,Android 主線程是線程不安全的,也就是說,更新UI只能在主線程中更新,子線程中操作是危險(xiǎn)的。Handler 就用來解決這個(gè)復(fù)雜的問題 ,由于 Handler 運(yùn)行在主線程中(UI線程中), 它與子線程可以通過 Message 對(duì)象來傳遞數(shù)據(jù),這個(gè)時(shí)候 Handler 就承擔(dān)著接受子線程傳遞的 Message 或者 Runnable 對(duì)象 (里面包含數(shù)據(jù)),把這些消息放入主線程隊(duì)列中,配合主線程進(jìn)行更新UI。

Handler 的特點(diǎn)

Handler 可以分發(fā) Message 對(duì)象和 Runnable 對(duì)象到主線程中, 每個(gè) Handler 實(shí)例,都會(huì)綁定到創(chuàng)建他的線程中(一般是位于主線程),它有兩個(gè)作用:

1. 安排 Message 或 Runnable 在某個(gè)主線程中某個(gè)地方執(zhí)行;

2. 安排一個(gè)動(dòng)作在不同的線程中執(zhí)行。

Handler 中分發(fā)消息的一些方法

post(Runnable)postAtTime(Runnable,long)postDelayed(Runnable long)sendEmptyMessage(int)sendMessage(Message)sendMessageAtTime(Message,long)sendMessageDelayed(Message,long)

以上 post 類方法允許你排列一個(gè) Runnable 對(duì)象到主線程隊(duì)列中,sendMessage 類方法,允許你安排一個(gè)帶數(shù)據(jù)的 Message 對(duì)象到隊(duì)列中,等待更新。

Handler 應(yīng)用實(shí)例

子類需要繼承 Handler 類,并重寫 handleMessage(Message msg) 方法,用于接受線程數(shù)據(jù)。

以下為一個(gè)實(shí)例,它實(shí)現(xiàn)的功能為:通過線程修改界面Button的內(nèi)容

public class MyHandlerActivity extends Activity { Button button; MyHandler myHandler; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.handlertest); button = (Button)findViewById(R.id.button); myHandler = new MyHandler();// 當(dāng)創(chuàng)建一個(gè)新的 Handler 實(shí)例時(shí),它會(huì)綁定到當(dāng)前線程和消息的隊(duì)列中,開始分發(fā)數(shù)據(jù) // Handler 有兩個(gè)作用:// 1. 定時(shí)執(zhí)行 Message 和 Runnalbe 對(duì)象 // 2. 讓一個(gè)動(dòng)作,在不同的線程中執(zhí)行 // 安排消息,用以下方法 // post(Runnable) // postAtTime(Runnable, long) // postDelayed(Runnable, long) // sendEmptyMessage(int) // sendMessage(Message) // sendMessageAtTime(Message, long) // sendMessageDelayed(Message, long) // 以上方法以 post 開頭的允許你處理Runnable對(duì)象 // sendMessage() 允許你處理 Message 對(duì)象(Message 里可以包含數(shù)據(jù)) MyThread m = new MyThread(); new Thread(m).start(); } /** * 接受消息,處理消息,此 Handler 會(huì)與當(dāng)前主線程一塊運(yùn)行 **/ class MyHandler extends Handler { public MyHandler() { } public MyHandler(Looper L) { super(L); } // 子類必須重寫此方法,接受數(shù)據(jù) @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub Log.d("MyHandler", "handleMessage"); super.handleMessage(msg); // 此處可以更新UI Bundle b = msg.getData(); String color = b.getString("color"); MyHandlerActivity.this.button.append(color); } } class MyThread implements Runnable { public void run() { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Message msg = new Message(); // 存放數(shù)據(jù) Bundle b = new Bundle(); b.putString("color", "我的");msg.setData(b);// 向Handler發(fā)送消息,更新UI MyHandlerActivity.this.myHandler.sendMessage(msg); } } }

總結(jié)

以上是生活随笔為你收集整理的Android开发之Handler的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。