《android视频教程》第一季 第15集 Handler的使用(二)
本节视频主要内容:
1、Handler与线程
2、Bundle的用法
3、在新线程中处理消息的方法
handler类允许你发送消息和处理线程消息队列中的消息及runnable对象。handler实例都是与一个线程和该线程的消息队列一起使 用,一旦 创建了一个新的handler实例,系统就把该实例与一个线程和该线程的消息队列捆绑起来,这将可以发送消息和runnable对象给该消息队列,并在消 息队列出口处处理它们。
handler类有两种主要用途:1。按照时间计划,在未来某时刻,对处理一个消息或执行某个runnable实例。2。把一个对另外线程对象的操作请求放入消息队列中,从而避免线程间冲突。
时间类消息通过如下方法使用: post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)
methods. post之类函数可以传输一个runnable对象给消息队列,并在到达消息队列后被调用。sendmessage之类函数可以传送一个包含数据的 message对象,该message对象可以被Handler类的handleMessage(Message) 方法所处理。
post之类函数和sendmessage之类的函数都可以指定消息的执行时机,是立即执行、稍后一段时间执行,还是在某个确定时刻执行。这可以用来实现超时、消息或其他时间相关的操作。
当一个进程启动时,主线程独立执行一个消息队列,该队列管理着应用顶层的对象(如:activities、broadcast receivers等等)和所有创建的窗口。你可以创建自己的一个线程,并通过handler来与主线程进行通信。这可以通过在新的线程中调用主线程的 handler的post和sendmessage操作来实现。
参考代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | 1、HandlerTest.java: package com.cxybase.HandlerTest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; /* * 1、验证了handler post()方法,调用的runnable和activity在同一个线程中执行,没有调用start()方法;直接调用线程run()方法 * 2、采用标准JAVA创建线程,是另外的启动线程,调用了start()方法 * 3、本例程包含两个文件,注意修改AndroidManifest.xml以启动你所想启动的例子 * */ public class HandlerTest extends Activity { private final static String TAG ="cxybase"; private Handler handler = new Handler(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //使用handler调用线程 // handler.post(r); //采用标准调的JAVA实现线程 Thread t = new Thread(r); t.start(); //打印当前线程的ID和name Log.i(TAG, "activity--->" + Thread.currentThread().getId()); Log.i(TAG, "activityName--->" + Thread.currentThread().getName()); } Runnable r = new Runnable() { public void run() { // TODO Auto-generated method stub Log.i(TAG, "handler--->" + Thread.currentThread().getId()); Log.i(TAG, "handlerName--->" + Thread.currentThread().getName()); try { Thread.sleep(1000); }catch(InterruptedException e) { e.printStackTrace(); } } }; } |
2、HandlerTest2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | package com.cxybase.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.view.animation.BounceInterpolator; public class HandlerTest2 extends Activity{ private final static String TAG="cxybase"; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.i(TAG, "activity-->" + Thread.currentThread().getId()+ " : " + Thread.currentThread().getName()); //实现了使用looper来处理消息队列的功能 //这个类由android框架提供 HandlerThread handlerThread = new HandlerThread("handler_thread"); handlerThread.start(); MyHandler myHandler = new MyHandler(handlerThread.getLooper()); Message msg = myHandler.obtainMessage(); // msg.obj = "abc"; Bundle b = new Bundle(); b.putInt("age", 20); b.putString("name", "jim"); msg.setData(b); msg.sendToTarget(); } class MyHandler extends Handler { public MyHandler() { } public MyHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub //取出Bundle数据 Bundle b = msg.getData(); int age = b.getInt("age"); String name = b.getString("name"); Log.i(TAG, "handler--->"+Thread.currentThread().getId() + " " + Thread.currentThread().getName()); Log.i(TAG, "handleMessage"); Log.i(TAG, "Bundle value: " + "age:" + age + " name:" + name ); //取出obj数据 // String s = (String)msg.obj; // Log.i(TAG, s); } } } |














