您的位置:首页 > 移动开发 > Android开发

Android(七) Handler、多线程、buddle

2015-12-18 20:16 387 查看
本文内容简介:

讲解Handler的传递消息的作用,以及多线程相关的知识,以及buddle的使用

Handler

Handler的简单描述:

1. Handler这个类就是管理某个线程(也可能是进程)的消息队列,比如让Handler处理主线程的消息队列,这样就可以将一些耗时任务放到其他线程之中,待任务完成之后就往主线程的消息队列中添加一个消息,这样Handler的Callback,即handleMessage就会被调用。但是Handler并不是线程安全的,因此官方文档中建议将Handler作为一个静态内部类。

2. 所以Handler只是处理消息,耗时任务放在其他线程。

3. Handler的使用主要是android中无法在主线程(即UI线程)中访问网络、无法在子线程中访问UI线程元素。一般是在子线程中访问网络,然后使用Handler发送message通知主线程处理UI更新操作

1.Handler简单使用

为多线程的一种方法,实际上Handler和main的线程在一个里面。需要参考第3部分的handler使用才是真正的多线程

步骤:

创建Handler对象

创建Runnable

复写runnable中的run,可以加入postdelay

使用handler.post(runnable)或者handler.removeCallbacks(runnable)**

Handler handler = new Handler(); //初始化handler
Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("this is runable!");
handler.postDelayed(runnable, 3000); //推迟3000ms再将runnable加入队列
}
};


加入和移除Thread

handler.post(runnable);             //加入到队列中
handler.removeCallbacks(runnable);  //从队列中移除runnable


run运行结束则线程死亡

Thread.currentThread().getId()用于得到当前线程的ID

2.Handler的消息传递

需要复写handleMessage函数

Handler handler = new Handler(){

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
System.out.println(msg.arg1);
}
};


Runnable runnable = new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
/*得到消息对象*/
Message msg = handler.obtainMessage();
msg.arg1 = 10;
/*发送消息到消息队列中,会在handler的处理函数中接收到*/
handler.sendMessage(msg);
System.out.println("this is runable!");
handler.postDelayed(runnable, 3000);
}
};


3.真正多线程

以上两种方法都是在同一个线程中的

Thread thread = new Thread(runnable);
thread.start();


4.Handler的另一种消息传递方法

Bundle是一种特殊的Map键值对为(string, 其他一般的数据类型-不可以是object)

设置启动handlerThread,然后初始化MyHandler对象,最后得到msg并且发送消息

HandlerThread handlerThread = new HandlerThread("demo thread");
handlerThread.start(); //必须要运行,不然下面getlooper得到的为空
MyHandler handler = new MyHandler(handlerThread.getLooper());
Message msg = handler.obtainMessage(); //获得msg
Bundle bundle = new Bundle();
bundle.putInt("age", 20);
msg.setData(bundle); //设置数据
msg.sendToTarget();  //发送给获得msg的handler


复写handler

class MyHandler extends Handler
{
MyHandler(Looper looper)
{
super(looper);
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Bundle bundle = msg.getData();
System.out.println(" id:"+Thread.currentThread().getId() + " age: " + bundle.getInt("age"));
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: