導航:首頁 > 操作系統 > androidhandler傳遞對象

androidhandler傳遞對象

發布時間:2022-08-19 05:41:37

android byte怎麼通過handler傳輸

java">byteb=1;
Bundlebundle=newBundle();
bundle.putByte("b",b);
byte[]bs=newbyte[10];
bundle.putBundle("bs",bs);
Handlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
}
};
Messagemessage=handler.obtainMessage();
message.setData(bundle);
handler.sendMessage(message);

上面的代碼是handler傳遞byte,以及byte數組的方法。

如果您對回答滿意,請關注一下俺名字中的微博,更多例子請網路安卓無憂。

Ⅱ Android的handler機制的原理

Android的handler機制的原理分為非同步通信准備,消息發送,消息循環,消息處理。

1、非同步通信准備

在主線程中創建處理器對象(Looper)、消息隊列對象(Message Queue)和Handler對象。

2、消息入隊

工作線程通過Handler發送消息(Message) 到消息隊列(Message Queue)中。

3、消息循環

消息出隊: Looper循環取出消息隊列(Message Queue) 中的的消息(Message)。

消息分發: Looper將取出的消息 (Message) 發送給創建該消息的處理者(Handler)。

4、消息處理

處理者(Handler) 接收處理器(Looper) 發送過來的消息(Message),根據消息(Message) 進行U操作。

handler的作用

handler是android線程之間的消息機制,主要的作用是將一個任務切換到指定的線程中去執行,(准確的說是切換到構成handler的looper所在的線程中去出處理)android系統中的一個例子就是主線程中的所有操作都是通過主線程中的handler去處理的。

Handler的運行需要底層的 messagequeue和 looper做支撐。



Ⅲ 簡述android studio中handler通信

在Android中,對於UI的操作通常需要放在主線程中進行操作。如果在子線程中有關於UI的操作,那麼就需要把數據消息作為一個Message對象發送到消息隊列中,然後,用Handler中的handlerMessge方法處理傳過來的數據信息,並操作UI。類sendMessage(Message msg)方法實現發送消息的操作。 在初始化Handler對象時重寫的handleMessage方法來接收Messgae並進行相關操作。
傳遞Runnable對象。用於通過Handler綁定的消息隊列,安排不同操作的執行順序。
Handler對象在進行初始化的時候,會默認的自動綁定消息隊列。利用類post方法,可以將Runnable對象發送到消息隊列中,按照隊列的機制按順序執行不同的Runnable對象中的run方法。
另外,Android的CPU分配的最小單元是線程,Handler一般是在某個線程里創建的,因而Handler和Thread就是相互綁定的,一一對應。而Runnable是一個介面,Thread是Runnable的子類。所以說,他倆都算一個進程。

Ⅳ android message傳遞數據到handler的問題

第一種思想是推薦使用的,任何函數在調用的時候,涉及到傳遞參數,都會降低效率。根據message的源碼setData(Bundle data)它的注釋:
Sets a Bundle of arbitrary data values. Use arg1 and arg1 members as a lower cost way to send a few simple integer values, if you can.意思是說,盡量使用arg1和arg2傳遞整型數據,降低開銷(lower cost)。因此你的第二種想法完全就是多此一舉,因為Handler的設計思想就是通知主線程更新數據,用最小的開銷去通知。

Ⅳ android中handler如何使用

Handler在Android中主要是負責發送和處理消息。它的主要用途大致是下面兩個:

1)按計劃發送消息或執行某個Runnanble;

2)從其他線程中發送來的消息放入消息隊列中,避免線程沖突(常見於更新UI線程)

學寫一下,在UI線程中,系統已經有一個Activity來處理了,你可以再起若干個Handler來處理。在實例化Handler的時候,只要有Handler的指針,任何線程也都可以sendMessage。

Handler對於Message的處理是非同步處理的。一個Looper 只有處理完一條Message才會讀取下一條,所以消息的處理是阻塞形式的(handleMessage()方法里不應該有耗時操作,可以將耗時操作放在其他線程執行,操作完後發送Message(通過sendMessges方法),然後由handleMessage()更新UI)。

根據對視頻的學習寫了一個通過Button控制項啟動進度條(類似於下載等操作)的程序,簡單介紹一下,有兩個Button控制項,一個是開始,點擊之後會顯示一個進度條以每次十分之一的進度進行(一開始是隱藏的),另一個是停止,可以中斷進度。

java代碼:

1 package zzl.handleactivity;

2

3 import android.app.Activity;

4 import android.os.Bundle;

5 import android.os.Handler;

6 import android.os.Message;

7 import android.view.Gravity;

8 import android.view.View;

9 import android.view.View.OnClickListener;

10 import android.widget.Button;

11 import android.widget.ProgressBar;

12 import android.widget.Toast;

13

14 public class Handler_01 extends Activity {

15

16 //聲明變數

17 private Button startButton=null;

18 private Button endButton=null;

19 private ProgressBar firstBar=null;

20 private Toast toast=null;

21 @Override

22 protected void onCreate(Bundle savedInstanceState) {

23 super.onCreate(savedInstanceState);

24 setContentView(R.layout.main);

25

26 //根據ID獲取對象

27 startButton =(Button)findViewById(R.id.startButton);

28 endButton=(Button)findViewById(R.id.endButton);

29 firstBar=(ProgressBar)findViewById(R.id.firstBar);

30 //給對象設置動作監聽器

31 startButton.setOnClickListener(new StartButtonListener());

32 endButton.setOnClickListener(new EndButtonListener());

33 }

34

35 class StartButtonListener implements OnClickListener{

36

37 @Override

38 public void onClick(View v) {

39 // TODO Auto-generated method stub

40 //一開始執行,加入到消息隊列,不延遲,

41 //然後馬上執行run方法

42 firstBar.setVisibility(View.VISIBLE);

43 firstBar.setMax(100);

44 handler.post(upRunnable);

45 toast=Toast.makeText(Handler_01.this, "運行開始", Toast.LENGTH_SHORT);

46 toast.setGravity(Gravity.CENTER, 0, 0);

47 toast.show();

48 }

49 }

50 class EndButtonListener implements OnClickListener{

51

52 @Override

53 public void onClick(View v) {

54 // TODO Auto-generated method stub

55 //停止

56 handler.removeCallbacks(upRunnable);

57 System.out.println("It's time to stop...");

58 }

59 }

60

61 //創建handler對象,在調用post方法

62 //非同步消息處理:將下載或者處理大數據等等單獨放到另一個線程

63 //更好的用戶體驗

64 Handler handler=new Handler(){

65

66 @Override

67 public void handleMessage(Message msg){

68 firstBar.setProgress(msg.arg1);

69 firstBar.setSecondaryProgress(msg.arg1+10);

70 //handler.post(upRunnable);

71 if(msg.arg1<=100) {

72 handler.post(upRunnable); //將要執行的線程放入到隊列當中

73 }else {

74 handler.removeCallbacks(upRunnable);

75 }

76 }

77 };

78

79 //聲明線程類:實現Runnable的介面

80 Runnable upRunnable=new Runnable() {

81

82 int i=0;

83 @Override

84 public void run() {//程序的運行狀態

85 // TODO Auto-generated method stub

86 //postDelayed方法:把線程對象加入到消息隊列中

87 // 隔2000ms(延遲)

88 System.out.println("It's time to start...");

89 i=i+10;

90 //獲取Message消息對象

91 Message msg=handler.obtainMessage();

92 //將msg對象的arg1(還有arg2)對象的值設置

93 //使用這兩個變數傳遞消息優點:系統消耗性能較少

94 msg.arg1=i;

95 try{

96 //設置當前顯示睡眠1秒

97 Thread.sleep(1000);

98 }catch(InterruptedException e){

99 e.printStackTrace();

100 }

101 //將msg對象加入到消息隊列當中

102 handler.sendMessage(msg);

103 if(i==100){//當值滿足時,將線程對象從handle中剔除

104 handler.removeCallbacks(upRunnable);

105 firstBar.setVisibility(View.GONE);

106 //臨時彈出

107

108 toast=Toast.makeText(Handler_01.this, "運行結束", Toast.LENGTH_SHORT);

109 toast.setGravity(Gravity.CENTER, 0, 0);

110 toast.show();

111 }

112 }

113 };

114 }

main.xml

1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

2 xmlns:tools="http://schemas.android.com/tools"

3 android:orientation="vertical"

4 android:layout_width="match_parent"

5 android:layout_height="match_parent"

6 tools:context=".Handler_01" >

7

8 <ProgressBar

9 android:id="@+id/firstBar"

10 style="?android:attr/progressBarStyleHorizontal"

11 android:layout_width="200dp"

12 android:layout_height="wrap_content"

13 android:visibility="gone"/>

14

15 <Button

16 android:id="@+id/startButton"

17 android:layout_width="wrap_content"

18 android:layout_height="wrap_content"

19 android:text="@string/start" />

20

21 <Button

22 android:id="@+id/endButton"

23 android:layout_width="wrap_content"

24 android:layout_height="wrap_content"

25 android:text="@string/end" />

26

27 </LinearLayout>

總結:

1)當點擊開始或者運行結束的時候,都會通過調用Toas彈出臨時窗口,Toast.makeText(Handler_01.this, "運行結束", Toast.LENGTH_SHORT),這一句一開始總是執行出錯,原因在於必須調用它的show方法才可以顯示出來,還可以通過設置它的位置來顯示;

2)在xml中 android:text="@string/end",則需要在layout下的string文件中敲寫相應的代碼

3)原本代碼有一些瑕疵,就是沒有下面這一段代碼:

1 if(msg.arg1<=100) {

2 handler.post(upRunnable); //將要執行的線程放入到隊列當中

3 }else {

4 handler.removeCallbacks(upRunnable);

5 }

這樣就導致了upRunnable的run方法出現了死循環,這樣,雖然程序UI本身沒有問題,但是內部卻又很大的缺陷

這是因為

1 if(i==100){//當值滿足時,將線程對象從handle中剔除

2 handler.removeCallbacks(upRunnable);

3 firstBar.setVisibility(View.GONE);

4 toast=Toast.makeText(Handler_01.this, "運行結束", Toast.LENGTH_SHORT);

5 toast.setGravity(Gravity.CENTER, 0, 0);

6 toast.show();

7 }

這一段代碼看似是把upRunnable線程從線程對象隊列中移除,但是再次之前又前執行了handler.sendMessage(msg);這句代碼

從而導致下面的代碼又被執行到

1 public void handleMessage(Message msg){

2 firstBar.setProgress(msg.arg1);

3 firstBar.setSecondaryProgress(msg.arg1+10);

4

5 }

這樣肯定會使upRunnable線程重新加入到線程對象隊列中,updateThread的run方法重復執行,這就導致了死循環。所以必須加上之前的那段代碼,通過判斷來控制循環終止。並且run方法中的if(i==100)的那段代碼也是可以不用的,不過我是寫了一些其他代碼就懶得優化了,這是後話了。

4) 剛剛大家看到我們可以通過敲寫System.out.println在logcat中顯示,一開始eclipse編譯器中是沒有,這是如何顯示出來的?

大家可以再window的show view中找到logCat(deprecated)通過下圖中綠色的「+」添加出來

然後顯示內容的時候,選擇右上角「V D I W E 」的I就可以比較清晰的顯示出來了,當然你也可以選擇另外一個logCat來顯示,方法類似。

5)實際上,Handler在默認情況下,和調用它的Activity是處於同一個線程的。 上述Handler的使用示例中,雖然聲明了線程對象,但是在實際調用當中它並沒有調用線程的start()方法,而是直接調用當前線程的run()方法。

如果要實現調用另一個新的線程,只要注釋post方法,然後加上這樣兩段代碼即可: Thread t = new Thread(r); t.start();

Ⅵ android通過Handler使子線程更新UI

在Android項目中經常有碰到這樣的問題,在子線程中完成耗時操作之後要更新UI,下面就自己經歷的一些項目總結一下更新的方法。

一. 引言

首先來看一下android中消息機制:

專業術語:

Message:消息,其中包含了消息ID,消息處理對象以及處理的數據等,由MessageQueue統一列隊,終由Handler處理。
Handler:處理者,負責Message的發送及處理。使用Handler時,需要實現handleMessage(Message msg)方法來對特定的Message進行處理,例如更新UI等。
MessageQueue:消息隊列,用來存放Handler發送過來的消息,並按照FIFO規則執行。當然,存放Message並非實際意義的保存,而是將Message以鏈表的方式串聯起來的,等待Looper的抽取。
Looper:消息泵,不斷地從MessageQueue中抽取Message執行。因此,一個MessageQueue需要一個Looper。
Thread:線程,負責調度整個消息循環,即消息循環的執行場所。

二. 方法

1. 用Handler

(1)主線程中定義Handler:

Java代碼:

[java]view plain

HandlermHandler=newHandler(){

@Override

publicvoidhandleMessage(Messagemsg){

super.handleMessage(msg);

switch(msg.what){

case0:

<spanstyle="color:#009900;">//完成主界面更新,拿到數據</span>

Stringdata=(String)msg.obj;

updateWeather();

textView.setText(data);

break;

default:

break;

}

}

};

(2)子線程發消息,通知Handler完成UI更新:

java代碼:

privatevoipdateWeather(){

newThread(newRunnable(){

@Override

publicvoidrun(){

<spanstyle="color:#009900;">//耗時操作,完成之後發送消息給Handler,完成UI更新;</span>

mHandler.sendEmptyMessage(0);

<spanstyle="color:#33cc00;">//需要數據傳遞,用下面方法;</span>

Messagemsg=newMessage();

msg.obj="數據";<spanstyle="color:#33cc00;">//可以是基本類型,可以是對象,可以是List、map等;</span>

mHandler.sendMessage(msg);

}

}).start();

}

注意:Handler對象必須定義在主線程中,如果是多個類直接互相調用,就不是很方便,需要傳遞content對象或通過介面調用。

2.用Activity對象的runOnUiThread方法更新

在子線程中通過runOnUiThread()方法更新UI:

java代碼:

newThread(){

publicvoidrun(){

<spanstyle="color:#009900;">//這兒是耗時操作,完成之後更新UI;</span>

runOnUiThread(newRunnable(){

@Override

publicvoidrun(){

<spanstyle="color:#009900;">//更新UI</span>

imageView.setImageBitmap(bitmap);

}

});

}

}.start();

如果在非上下文類中,可以通過傳遞上下文實現調用:

java代碼:

Activityactivity=(Activity)imageView.getContext();

activity.runOnUiThread(newRunnable(){

@Override

publicvoidrun(){

imageView.setImageBitmap(bitmap);

}

});

注意:這種方法使用比較靈活,但如果Thread定義在其他地方,需要傳遞Activity對象。


3.
View.post(Runnable r)

java代碼:

imageView.post(newRunnable(){

@Override

publicvoidrun(){

imageView.setImageBitmap(bitmap);

}

});

這種方法更簡單,但需要傳遞要更新的View過去。

總結:UI的更新必須在主線程中完成,所以不管上述那種方法,都是將更新UI的消息發送到了主線程的消息對象,讓主線程做處理。

Ⅶ android開發中關於handler部分的困惑

這么說吧,handler是一個消息隊列,其中就有這個Message 當你new了一個handler的時候同時就攜帶了一個Message對象!當你需要傳遞信息的時候直接拿就ok了。同時建議你看一下啊Handler 的機制原理
(給你列舉一下算了):
andriod提供了 Handler 和 Looper 來滿足線程間的通信。Handler 先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(Message Exchange)。
1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程里的Message Queue(消息隊列)。
2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到Message Queue里;或者接收Looper從Message Queue取出)所送來的消息。
3) Message Queue(消息隊列):用來存放線程放入的消息。
4)線程:UI thread 通常就是main thread,而Android啟動程序時會替它建立一個Message Queue。

Ⅷ Android用handler在線程間傳值

想要讓Activity收到消息,就要使用它自己的handler。
你可以在activity中聲明一個靜態的handler,在onCreat方法中初始化。
然後再其他線程直接調用。
還有就是,你應該把activity的handler賦值給Thread的

不知道為什麼網路抽了,沒有辦法追問,關於你的程序,我試調一下,消息傳遞沒有問題,吧前面的網頁訪問注釋掉直接向Activity發送消息,已經收到,請檢查你代碼的其他部分

閱讀全文

與androidhandler傳遞對象相關的資料

熱點內容
以肉為主的穿越 瀏覽:515
名家編譯委員會的版本怎麼樣 瀏覽:186
安卓系統如何查看復制記錄 瀏覽:905
小苮兒短篇有聲小說網盤 瀏覽:234
安卓71如何從tp上下載光遇 瀏覽:997
centosyumjava安裝 瀏覽:798
夏開頭的電影,電視劇 瀏覽:622
綠色的夜晚在線免費觀看電影 瀏覽:715
日本電影里有個叫布川褲子是什麼電影 瀏覽:612
sed命令組合 瀏覽:371
三年級孩子剛學編程的作品 瀏覽:427
韓劇帶個小女孩的殺手 瀏覽:630
java通訊機 瀏覽:831
伺服器的後台是什麼樣子 瀏覽:139
韓國賣保險的女人電影 瀏覽:805
全裸同性大尺度電影有哪些 瀏覽:256
《 男孩的名字叫男孩 》電影 瀏覽:300
解壓音樂跑酷游戲 瀏覽:860
蘇州市軟體加密方案 瀏覽:167
非洲建國小說 瀏覽:143