Coin163

首页 > Android中Handler Thread及Runnable之间的关系

Android中Handler Thread及Runnable之间的关系

相关标签: android 多线程 thread

2021腾讯云限时秒杀,爆款1核2G云服务器298元/3年!(领取2860元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1062

2021阿里云最低价产品入口+领取代金券(老用户3折起),
入口地址https://www.aliyun.com/minisite/goods

相关推荐:Java多线程 之 Runnable Thread (一)

最近看的东西有些乱。励志从XOA2看起、学起,发现需要看下thrift,看着看着thrift,发现需要学学NIO,学完了NIO温习温习前面看的thrift,却要休假10天。休假回来,感觉要学学多线程。多线程这厮,看《Thinking in java》第21章的前几个小节,这是第3次了。这

Android中Handler Thread及Runnable之间的关系

在多线程编程这块,我们经常要使用Handler,Thread和Runnbale这三个类,那么他们之间的关系你是否弄清楚了呢?

首先,说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。

而Runnable是一个接口,Thread是Runnbale的子类。所以说,他俩都算是一个进程。

HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息循环。与其说Handler和一个线程绑定,不如说Handler是和Looper一一对应的。最后需要说明的是,在UI线程(主线程)中:

mHandler=new  Handler();

mHandler.post(new  Runnable(){

void  run(){

//执行代码...

}

});

这个线程其实是在UI线程之内运行的,并没有新建线程。

常见的新建线程的方法是:

Thread  thread  =  new  Thread();

thread.start();

HandlerThread  thread  =  new  HandlerThread("string");

thread.start();


<->Handler的定义:

主要接受子线程发送的数据,并用此数据配合主线程更新UI。

解释:当Android应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程管理界面中的UI控件,负责事件分发,比如说,你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如:联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没 有完成的话,,会收到Android系统的一个错误提示 "强制关闭"。这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到 UI更新,


<二> Handler一些特点

handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
它有两个作用:

(1):安排消息或Runnable在某个主线程中某个地方执行;

(2):安排一个动作在不同的线程中执行


Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)

以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法,允许你安排一个带数据的Message对象到队列中,等待更新.


<三> Handler实例

(1) 子类需要继承Handler类,并重写handleMessage(Message  msg) 方法,用于接受线程数据;以下为一个实例,它实现的功能为:通过线程修改界面Button的内容
public class MyHandlerActivity extends Activity {

Button button;

MyHandler myHandler;

 

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.handlertest);

button = (Button) findViewById(R.id.button);

myHandler = new MyHandler();   

  // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据

// Handler有两个作用:(1) : 定时执行Message和Runnalbe 对象; 

// (2): 让一个动作,在不同的线程中执行.

// 它安排消息,用以下方法:

// post(Runnable);

// postAtTime(Runnable,long);

// postDelayed(Runnable,long);

// sendEmptyMessage(int);

// sendMessage(Message);

// sendMessageAtTime(Message,long);

相关推荐:Java多线程--Runnable和Thread - 博客频道 - CSDN.NET

概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和Runnable。 之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程。关于线程池的内容,我们以后会详细介绍;现在,先对的Thread和Runnable进行了解。本章内容包

// sendMessageDelayed(Message,long);


// 以上方法以 post开头的允许你处理Runnable对象;

//sendMessage()允许你处理Message对象(Message里可以包含数据,);


MyThread m = new MyThread();

new Thread(m).start();

}


/**

* 接受消息,处理消息 ,此Handler会与当前主线程一块运行

* */

class MyHandler extends Handler {

public MyHandler() { }

public MyHandler(Looper L) {

super(L);

}

// 子类必须重写此方法,接受数据

@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

Log.d("MyHandler", "handleMessage......");  

super.handleMessage(msg);

// 此处可以更新UI

Bundle b = msg.getData();

String color = b.getString("color");

MyHandlerActivity.this.button.append(color);

 }


class MyThread implements Runnable {

public void run() { 

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

Log.d("thread.......", "mThread........"); 

      Message msg = new Message();

Bundle b = new Bundle();// 存放数据

b.putString("color", "我的");

msg.setData(b);

MyHandlerActivity.this.myHandler.sendMessage(msg); //向handler发送消息,更新UI

}

}

}

原文

Android中Handler Thread及Runnable之间的关系 在多线程编程这块,我们经常要使用Handler,Thread和Runnbale这三个类,那么他们之间的关系你是否弄清楚了呢? 首先,说明Android的CPU分配的最小

------分隔线----------------------------