永发信息网

android message传递数据到handler的问题

答案:2  悬赏:50  手机版
解决时间 2021-01-29 05:11
android message传递数据到handler的问题
最佳答案
package org.hualang.handlertest;

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.widget.Toast;

public class HandlerTest4 extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("System.out","Activity所在线程的id:"+Thread.currentThread().getId());

HandlerThread handlerThread = new HandlerThread("handlerThread");

handlerThread.start();
MyHandler handler = new MyHandler(handlerThread.getLooper());
Message msg = handler.obtainMessage();

//msg.obj = "Hello world";
Bundle b = new Bundle();
b.putInt("age", 22);
b.putString("name", "loulijun");
msg.setData(b);
msg.sendToTarget();
}
class MyHandler extends Handler
{
public MyHandler()
{
}
public MyHandler(Looper looper)
{
super(looper);
}
public void handleMessage(Message msg)
{
//String str = (String)msg.obj
Bundle b = msg.getData();
int age = b.getInt("age");
String name = b.getString("name");
Toast toast = Toast.makeText(getApplicationContext(), "age="+age+"name="+name, Toast.LENGTH_LONG);
toast.show();
Log.d("System.out", "handler所在线程的id:"+Thread.currentThread().getId());
}
}
}

如果是msg.obj,那么可以这样用
msg.obj = "Welcome to china";

然后在handleMessage()方法中用

String str = (String)msg.obj;来获得传递的值

如果使用getData()方法的话,需要用到Bundle对象来传递
全部回答
第一种思想是推荐使用的,任何函数在调用的时候,涉及到传递参数,都会降低效率。根据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的设计思想就是通知主线程更新数据,用最小的开销去通知。追问那么,message的传递数据用在什么时候?因为在我现在需要做的大部分情况都可以用方法1来完成追答大部分情况下,用来传递使用频率比较低的局部变量,且以基本类型的数据为主追问我又看了次源码,原先的理解有错误,他的意思是直接去修改message.arg1和message.arg2两个
Message类里面的变量。那么setdata是用于修改message了bundle data。message里还有一个变量是obj。。那么现在的问题。假设我现在理解是正确的,那么传递数据只用赋值obj,然后强制转换就可以。这个理解正确吗追答函数在传递参数调用的时候,都要开辟临时变量保存参数,handler传递数据也一样,所以效率低追问回答了我修改问题前的问题。。。>_>不过谢谢哈。。。麻烦看一下我刷新后的问题
假设我的理解是正确的,那么为什么还要setdata(Bundle bundle)我觉得这个做法比起直接给obj赋值没有优点啊追答在源码里obj的解释是这样的:
An arbitrary object to send to the recipient. When using Messenger
to send the message across processes this can only be non-null if it contains a
Parcelable of a framework class (not one implemented by the application). For
other data transfer use setData. 意思是,obj可以传递任意类型的数据,但在进程间传递序列化的框架类时必须保证非空,并建议传递其他数据时还是以setData()为主;
设计obj的主要目的是传递引用数据类型,bundle是可以一次性传递多种基本数据类型的载体
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
4个月大小猫使用大宠爱滴剂过量的后果
The bird is ___the top of the tree.
QQ,微信图标右上方数字'红圈怎么删除?
为什么小狗狗长大了,母狗就会特别讨厌它
PF31888222的百元人民币,第五套有价值吗
语脉的意思是什么啊?知道的请说下!
黄河路桥在哪里啊,我有事要去这个地方
资源县新艺电脑科技中心地址在什么地方,想过
“我们的政体并不与其他人的制度相敌对。我们
韩国ALOE VERA100%芦荟胶和完美的相比哪个好
思维和思路有什么区别
织金的意思是什么啊?知道的请说下!
天平汽车保险是全国第一家专业做车险的公司?
神宇电脑地址在哪,我要去那里办事
胃癌手术后能活几年
推荐资讯
俊茂的意思是什么啊?知道的请说下!
天天用香皂洗脚还有味,怎么样才方便的能除味
干红葡萄酒和干白葡萄酒的区别?
无齿锯切割机更换锯片时应注意什么?
耐美鞋业怎么去啊,我要去那办事
除陌钱的意思是什么啊?知道的请说下!
我找人帮我在我的IOS怪物猎人2g 改了一只变态
中国邮政储蓄银行(龙池支行)(龙池镇街上)怎么
忆恋宾馆地址在什么地方,我要处理点事
比比皆是的意思是什么啊?知道的请说下!
.The story goes William Tell did kill th
昌河铃木汽车地址在什么地方,我要处理点事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?