andriod提供了 Handler 和 Looper 来满足线程间的通信。为了研究其中线程机制的问题,写了2个demo:
Demo1:
package com.mp;import android.app.Activity;import android.os.Bundle;import android.os.Handler;public class MyThread extends Activity {    private Handler handler = new Handler();    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        handler.post(new MyRunnable());           System.out.println("Oncreate---The Thread id is :"                + Thread.currentThread().getId());        setContentView(R.layout.main);    }    private class MyRunnable implements Runnable {        public void run() {            System.out.println("Runnable---The Thread is running");            System.out.println("Runnable---The Thread id is :"                    + Thread.currentThread().getId());            try {                Thread.sleep(6000);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

在这个demo中,整个过程如下:
程序已启动,就把MyRunnable加入到消息队列中,android的handler是异步机制,所以在handler.post(new MyRunnable()); 之后,程序会继续执行,所以以后的语句会继续,这时候我们输出Oncreate中的当前线程ID。同时MyRunnable的run方法也在运行,一样输出run方法中的当前线程ID,然后让线程休眠6秒。
demo的结果分析:
1:控制台的输出: Oncreate---The Thread id is :1
Runnable---The Thread is running
Runnable---The Thread id is :1
2:程序启动后6秒,我们才看到main.xml中的内容(只有一个textview)

这2个结果都表明handler和主线程是同一个线程。如果这时候你做的是一个耗时的操作(比如下载),那么这样是不可行的。
于是,android给我们提供了Looper这样一个类。其实Android中每一个Thread都跟着一个Looper,Looper可以帮助Thread维护一个消息队列.

Demo2:
package com.mp;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;public class MyThread2 extends Activity {    private Handler handler = null;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        HandlerThread handlerThread = new HandlerThread("myHandlerThread");        handlerThread.start();        handler = new Handler(handlerThread.getLooper());        handler.post(new MyRunnable());        System.out.println("Oncreate---The Thread id is :"                + Thread.currentThread().getId());        setContentView(R.layout.main);    }    private class MyRunnable implements Runnable {        public void run() {            System.out.println("Runnable---The Thread is running");            System.out.println("Runnable---The Thread id is :"                    + Thread.currentThread().getId());            try {                Thread.sleep(6000);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

在这个demo中,用到了HandlerThread,在HandlerThread对象中可以通过getLooper方法获取一个Looper对象控制句柄,我们可以将其这个Looper对象映射到一个Handler中去来实现一个线程同步机制。于是就有以下结果;
1:控制台的输出: Oncreate---The Thread id is :1
Runnable---The Thread is running
Runnable---The Thread id is :10
2:程序启动后,我们立刻看到main.xml中的内容。
这样就达到了多线程的结果。
引自http://www.eoeandroid.com/forum.php?mod=viewthread&tid=30464

更多相关文章

  1. Android调用系统设置
  2. Android(安卓)在一个应用中如何启动另外一个已安装的应用!!!
  3. Android(安卓)Timer
  4. Android(安卓)Trusty TEE 2.启动分析
  5. Android短消息推送启动应用程序(SMS PUSH)(BroadCastReceiver)
  6. android联系人、短信、邮件url总结
  7. Android心得8--Internet
  8. Android(安卓)使用小技巧之 :new Handler().postDelayed() 延迟in
  9. 设置菜单默认值设置

随机推荐

  1. xml图像超链接的制作代码
  2. 详解xml型字符串解析时存在& < >符号时的
  3. 具体分析Pull方式解析XML的示例代码
  4. Microsoft.XMLHTTP对象介绍
  5. maven项目不编译xml文件的解决办法
  6. Jaxb2实现Bean与xml互转的示例代码详解
  7. java对象转换为xml格式的示例代码分享
  8. 如何打开xml文件介绍
  9. XStream实现Bean与xml互转的代码示例
  10. XML数据岛之数据修改与添加