安卓Handler机制的简单介绍——随机点名案例

来源:互联网 发布:fifa online3数据库cc 编辑:程序博客网 时间:2024/06/04 01:16

     笔者是一位初学Android的学生,前些阵子一直搞不懂关于Handler机制的一些问题,最近在网上找了不少资料,并加上自己的理解,写一个关于Handler机制工作原理的文章。

    我们知道,Android的UI线程也叫主线程,工作线程(子线程)主要是负责执行耗时操作的线程,那么,主线程要更新UI界面显示,必须通过子线程发的消息,才能作出对应的操作。那么,主线程是怎么知道什么时候要更新UI显示的呢,这个就是通过Handler机制发送的消息来执行。

首先来简单阐明一下几个关键字的概念:

1、Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2、Handler::你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3、 Message Queue(消息队列):用来存放线程放入的消息。
4、线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。

      子线程发送消息到Message Queue,主线程通过Looper去轮循这个消息队列,Looper轮循到的消息再传给主线程,主线程作出对应的操作,基本就是这样一个过程,对于新手,我觉得不用太纠结Handler到底是怎么内部工作的,毕竟我一开始也纠结了挺久的,到现在也是略知一二。

      大家可以通过下面这个“随机点名“的例子来进一步加深对Handler机制的理解:


import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements View.OnClickListener{
    private Button btnStart;
    private TextView tvName;
    private Handler handler;
    private boolean isRunning;
    private List<String> names;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        btnStart = (Button) findViewById(R.id.btn_start);
        tvName = (TextView) findViewById(R.id.tv_name);
        names = getNames();
        
        btnStart.setOnClickListener(this);
        handler = new Handler(new InnerCallback());
    }

    @Override
    public void onClick(View v) {
        if(isRunning == true){
            isRunning = false;
            btnStart.setText("Start");
        }else{
            isRunning = true;
            new InnerThread().start();
            btnStart.setText("Stop");
        }
    }
    
    private class InnerCallback implements Handler.Callback{
        @Override
        public boolean handleMessage(Message msg) {
            int index = msg.arg1;
            String name = names.get(index);
            tvName.setText(name);
            return false;
        }
        
    }

    private class InnerThread extends Thread{
        Random random = new Random();
        int nameCount = names.size();
        int ranNumber;
        long sleep = 500;
        @Override
        public void run() {
            while(isRunning){
                ranNumber = random.nextInt(nameCount);
                Message.obtain(handler, 0, ranNumber, 0).sendToTarget();
            }
            try {
                Thread.sleep(sleep);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
   private List<String> getNames(){
       List<String> names = new ArrayList<String>();
       names.add("周星驰");
       names.add("成龙");
       names.add("李连杰");
       names.add("叶问");
       names.add("甄子丹");
       names.add("刘德华");
       names.add("贾静雯");
       names.add("吴孟达");
       names.add("萧十一郎");
       names.add("小李飞刀");
       names.add("神雕侠侣");
       
       return names;
   }
    
}

下图是点击开始随机循环:

                        

下图是正在随机点名循环中,点击按钮停止,再次点击继续,如此。。                 

            


这样就实现了一个简单的随机点名的案例。

欢迎大家指正。

0 0
原创粉丝点击