Chinaunix首页 | 论坛 | 博客
  • 博客访问: 417428
  • 博文数量: 121
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1393
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-11 12:17
个人简介

www.vibexie.com vibexie@qq.com

文章分类

全部博文(121)

文章存档

2015年(55)

2014年(66)

我的朋友

分类: Android平台

2015-04-22 07:37:40

在andriod Handler Message Looper框架中,最难理解的就会是Looper了

Looper:

先看看android SDK对looper的描述,Handler Message Looper在sdk api不好找,注意是/android-sdk-linux/docs/reference/android/os/路径下。
Looper类用于在一条线程中运行一个消息循环,没有直接调用Looper的普通线程默认的不会关联一个消息循环。如果使线程具有消息循环,我们在该线程内需要调用Looper.prepare()使线程具备消息循环,调用Looper.loop()方法使该循环处理了消息后立即结束。注意在该线程关联的Looper没有停止前,线程一直在Looper.prepare()和Looper.loop()之间循环,知道结束了looper,才执行Looper.loop()之后的代码。

下面结合官方小demo写出一个好理解的小demo

demo

  1. package com.vibexie.handlermessagelooper;

  2. import android.os.Handler;
  3. import android.os.Looper;
  4. import android.os.Message;
  5. import android.support.v7.app.ActionBarActivity;
  6. import android.os.Bundle;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.view.View;
  10. import android.widget.Button;


  11. public class MainActivity extends ActionBarActivity {
  12.     private Button button;
  13.     private Button button2;
  14.     public Handler mHandler;

  15.     @Override
  16.     protected void onCreate(Bundle savedInstanceState) {
  17.         super.onCreate(savedInstanceState);
  18.         setContentView(R.layout.activity_main);

  19.         /**
  20.          * 启动线程,要格外注意的是:本demo为什么要使用button来向mHandler发送message,而不直接启动线程后,主线程立即向mHandler发送消息,
  21.          * 原因就是不能立即向mHander发送消息,因为启动线程需要一定的时间,立即发送消息的话,mHander可能还没有初始化,会出现空指针异常。
  22.          * ,你也可以不用button,可以先使主线程休眠一定时间,注意小于ANR时间,mHandler发送消息也是可以的,理解android编程,这一点很重要。
  23.          */
  24.         new LooperThread().start();

  25.         button=(Button)this.findViewById(R.id.button);
  26.         button2=(Button)this.findViewById(R.id.button2);

  27.         /**
  28.          * 点击button向Handler发送1
  29.          */
  30.         button.setOnClickListener(new View.OnClickListener() {
  31.             @Override
  32.             public void onClick(View v) {
  33.                 mHandler.obtainMessage(1).sendToTarget();
  34.             }
  35.         });

  36.         /**
  37.          * 点击button向Handler发送2,要求线程结束Looper
  38.          */
  39.         button2.setOnClickListener(new View.OnClickListener() {
  40.             @Override
  41.             public void onClick(View v) {
  42.                 mHandler.obtainMessage(2).sendToTarget();
  43.             }
  44.         });
  45.     }

  46.     /**
  47.      * Looper
  48.      */
  49.     class LooperThread extends Thread {
  50.         public void run() {

  51.             Looper.prepare();

  52.             mHandler = new Handler() {
  53.                 public void handleMessage(Message msg) {
  54.                     // process incoming messages here
  55.                     if(msg.what==1){
  56.                         System.out.println("---->>Looper中");
  57.                     }

  58.                     if(msg.what==2){
  59.                         System.out.println("---->>结束Looper");
  60.                         /**
  61.                          * 停止该线程关联的Looper,注意调用Looper的非静态方法,需要先获取Looper实例,如quit就是一个非静态方法
  62.                          */
  63.                         Looper.myLooper().quit();
  64.                     }
  65.                 }
  66.             };

  67.             /**
  68.              * 线程一直循环运行Looper.prepare()与Looper.loop()之间的代码
  69.              */
  70.             Looper.loop();

  71.             /**
  72.              * 注意该线程关联的Looper停止后,也就是在Looper中调用了Looper.myLooper().quit(),线程才调用之后的代码
  73.              */
  74.             System.out.println("---->>Looper外");
  75.         }
  76.     }
  77. }

运行结果如下(点击button,输出“---->>Looper中”,点击button2输出:"---->>结束Looper"和"---->>Looper外"):


可以看见,停止了Looper,就运行Looper.loop()之后的代码,最后退出线程,线程也就结束了。

看了这个demo,想必你又对Looper有了新的认识。对于Looper其它的方法,可以参看sdk文档:/docs/reference/android/os/Looper.html
阅读(2437) | 评论(0) | 转发(0) |
0

上一篇:nginx详解

下一篇:android之Handler详解

给主人留下些什么吧!~~