android message传递数据到handler的问题
答案:2 悬赏:50 手机版
解决时间 2021-01-29 05:11
- 提问者网友:动次大次蹦擦擦
- 2021-01-29 01:43
android message传递数据到handler的问题
最佳答案
- 五星知识达人网友:西风乍起
- 2021-01-29 02:37
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对象来传递
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对象来传递
全部回答
- 1楼网友:鱼芗
- 2021-01-29 03:59
第一种思想是推荐使用的,任何函数在调用的时候,涉及到传递参数,都会降低效率。根据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是可以一次性传递多种基本数据类型的载体
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是可以一次性传递多种基本数据类型的载体
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯