导航:首页 > 操作系统 > 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传递对象相关的资料

热点内容
第一个程序员等级 浏览:347
java服务器高级编程 浏览:874
午马演的和尚还有外国神父的电影 浏览:234
厌烦命令 浏览:626
阿里云服务器英文版 浏览:996
多彩换新官网app是做什么的 浏览:846
德国服务器地址 浏览:78
在线国语版电影免费 浏览:630
液压机压铁杯子解压视频 浏览:612
加密算法256位 浏览:348
网站源码怎么隐藏 浏览:64
哪个app能查看课本 浏览:789
程序员创业录 浏览:200
oppo手机有app但找不到在哪里 浏览:427
李彩潭哥哥的老婆 浏览:125
葡萄酒的世界pdf 浏览:797
男生接吻女生电影 浏览:378
云服务器基本维护 浏览:163
母乳喂养镜头电影有哪些 浏览:186
linuxsystem实现 浏览:278