android内部通信handler
生活随笔
收集整理的這篇文章主要介紹了
android内部通信handler
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
什么是handler?
handler主要用在用戶同自己創建的線程進行通信,andorid應用程序在主線程中會維護一個消息隊列,通過Message對象在線程間進行通信.在handler內部的handlerMessage中處理消息請求
其實學習過VC++的朋友應該可以很好的理解handler,類似于VC++中的消息處理
?
Message對象都都存儲了什么?
一共有4個參數,arg1,arg2,obj,what
arg1和arg2 是int類型,可以通過成員方法setData和getData訪問進行修改
obj ,object類型,可以存儲任意類型,比如放一個對象,一個int值,也就是消息中的附加數據
what,int類型,就是用戶定義的消息類型碼,可以通過what判斷是什么消息
?
我們來做個例子,這個例子有一個TextView顯示進度和完成及停止的內容,一個ProgressBar來顯示進度,兩個Button,用于開始和停止
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/LinearLayout1"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.ssln.handler.MainActivity" ><TextViewandroid:id="@+id/tvMsg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView" /><ProgressBarandroid:id="@+id/progbar"style="?android:attr/progressBarStyleHorizontal"android:layout_width="match_parent"android:layout_height="wrap_content" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content" ><Buttonandroid:id="@+id/btnstart"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="開始" /><Buttonandroid:id="@+id/btnstop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="停止" /></LinearLayout></LinearLayout>MainActivity.java
package com.ssln.handler;import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView;public class MainActivity extends Activity {private final int UPDATEMSG = 1; // 更新消息類型private final int COMPLETEMSG=2; // 完成消息private final int STOPMSG=3; // 停止消息private final int MAXVALUE = 100; // ProgressBar最大值private boolean isStop=false; //是否停止 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final TextView tvMsg = (TextView) findViewById(R.id.tvMsg);final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progbar);Button btnstart = (Button) findViewById(R.id.btnstart);Button btnstop=(Button)findViewById(R.id.btnstop);// 設置最大值 progressBar.setMax(MAXVALUE);// 初始化一個handler,用于更新textview和progressBarfinal Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch(msg.what){case UPDATEMSG:tvMsg.setText(msg.obj.toString() + "%");progressBar.setProgress(Integer.valueOf(msg.obj.toString()));break;case COMPLETEMSG:tvMsg.setText("完成了更新操作");break;case STOPMSG:tvMsg.setText("停止了更新操作");break;}}};//停止操作btnstop.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {isStop=true;}});//開始 使用BUTTON來創建一個新線程,來更新數據btnstart.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new Thread() {public void run() {Message msg;for (int i = 0; i < MAXVALUE; i++) {if(isStop){break;}// 循環發送消息,實現內部通信msg = new Message();msg.what = UPDATEMSG;msg.obj = i + 1;handler.sendMessage(msg);try {// 睡眠一段時間Thread.sleep(150);} catch (InterruptedException e) {e.printStackTrace();}}if(!isStop){//發送完成消息msg = new Message();msg.what =COMPLETEMSG ;handler.sendMessage(msg);}else{//發送停止消息msg = new Message();msg.what =STOPMSG ;handler.sendMessage(msg);isStop=false;}}}.start();}});}}當點擊開始按鈕后,每間隔150毫秒,會發送一個updatemsg,其中的obj為當前的進度值,進度條設置進度為obj,textview會顯示百分比
當進度到達100%的時候,會發送一個COMPLETEMSG 完成消息,用于TextView更新顯示
如果在更新過程中,點擊了停止,那開始的線程中就會跳出循環,并發送一個 STOPMSG 停止消息
轉載于:https://www.cnblogs.com/alwaysfirst/p/4006838.html
總結
以上是生活随笔為你收集整理的android内部通信handler的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSU 1337 搞笑版费马大定理(20
- 下一篇: (王道408考研操作系统)第五章输入/输