Android线程与消息处理
一、实现多线程
1.创建线程
(1)通过Thread创建线程
Thread thread = new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub } });
(2)通过实现Runnable()接口创建线程
public class MainActivity extends Activity implements Runnable{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); @Override public void run() { // TODO Auto-generated method stub } }
2.线程的开启
thread.start();
3.线程的休眠
Thread.sleep(1000);//休眠1秒
4.中断线程
public class MainActivity extends Activity implements Runnable{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LooperThread thread = new LooperThread(); thread.start(); thread.interrupt(); } @Override public void run() { // TODO Auto-generated method stub while(!Thread.currentThread().isInterrupted()){ // do something } } }
二、Handler消息传递机制
前面介绍了现成的用法,不过不能在新建的子线程中对UI进行修改。如果要操作,会报错Only the original thread that created a view hierarchy can touch its views。为此,Android引入Handler消息传递机制,来实现在线程中操作UI界面。
1.循环者(Looper)简介
在Android中,一个线程对应一个Looper对象,一个Looper对象对应一个MessageQueue(消息队列)。MessageQueue用于存放message。在MessageQueue中,存放的消息按照FIFO原则执行。
Looper对象用来为线程开启一个消息循环,从而操作MessageQueue。默认情况下,系统自动为主线程创建Looper对象,开启消息循环。所以,在主线程中用下面的代码创建Handler对象不会出错,而在非主线程中则会报错。
Handler handler = new Handler();
如果想在非主线程中创建Handler对象,必须用到Looper:
public class LooperThread extends Thread { public Handler h; @Override public void run() { // TODO Auto-generated method stub super.run(); Looper.prepare(); // h = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub Log.i("Looper", String.valueOf(msg.what)); } }; Message m = h.obtainMessage(); m.what = 0x11; h.sendMessage(m); Looper.loop(); } }
2.消息处理类(Handler)简介
Handler主要有以下两个作用:
(1)将Message或Runnable应用post()或sendMessage()方法发送到MessageQueue中,发送时可以指定延迟时间或者绑定的Bundle数据。当MessageQueue循环到该Message时,调用handlerMessage()方法对其处理。
(2)在子线程与主线程进行通信,也就是在工作线程中与UI进行通信
3.消息类(Message)简介
Message具有如下5个属性
1.arg1 int 用来存放整型数据
2.arg2 int 用来存放整型数据
3.obj Object用来存放发送给接收器的Object类型的任意对象
4.replyTo Messenger用来指定该Message该发往何处
5.what int 用户自定义消息代码
在使用时,需要注意以下3点:
1.通常使用Message.obtain()或Handler.obtainMessage()获取空消息对象,以节省资源
2.如果一个Message只需要携带简单的int信息,优先使用arg1和arg2来传递,这比Bundle节省内存
3.尽可能用Message.what来标识信息
- Android线程中消息处理(Handle,Looper)
- 简述android线程间消息处理机制(Looper、Handler和Message)
- Android线程之异步消息处理机制(三)——AsyncTask
- Android线程与消息处理
- Android线程与异步消息处理机制
- Java Socket 01 - 常识篇之消息处理
- Android消息处理系统——Looper、Handler、Thread(转载)
- AsyncTask和Handler处理异步消息
- Android 异步消息处理机制:Looper、Handler、Message
- 基于消息与.Net Remoting的分布式处理架构 推荐
- Floodlight中 处理packetin消息的顺序(1)
- (转)OpenFire源码学习之十三:消息处理
- 【翻译】Ext JS 4——Ajax和Rest代理处理服务器端一场和消息的方法
- 解决SOAPUI 调用WCF的服务返回由于 AddressFilter 在 EndpointDispatcher 不匹配,To 为“”的消息无法在接收方处理。请检查发送方和接收方的 Endpoin
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- Android异步消息处理机制(一)
- TWinControl.DefaultHandler里的CallWindowProc(FDefWndProc)还挺有深意的,TButton对WM_PAINT消息的处理就是靠它来处理的(以前不明白为什么总是要调用inherited,其实就是没有明白TWinControl.DefaultHandler的真正用处,而且还很有用)
- Android应用开发学习笔记之多线程与Handler消息处理机制
- 【Darwin学习笔记】之QTSSReflectorModule的Describe消息处理
- 网络消息监听处理