Handler 机制学习之基本用法

来源:互联网 发布:网络共享文件夹打不开 编辑:程序博客网 时间:2024/06/07 10:13
1.Handler的概念
主要是接受子线程发送的数据,并用此数据配合主线程更新UI。
一个Handler允许你来发送和处理与其绑定的线程的消息队列中的Message和Runnable对象。
(1)执行计划任务,主要是一些定时操作。
(2)线程间通信,主要是子线程发送数据,主线程用来跟新UI。

2.实例
(1)定时操作
主要是使用Handler的Delayed,比如sendMessageDelayed,postDelayed来进行定时操作。
public class MainActivity extends Activity implements OnClickListener{        private Button start = null;    private Button stop = null;        Handler myHandler = new Handler();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                start = (Button)findViewById(R.id.start);        stop = (Button)findViewById(R.id.stop);                start.setOnClickListener(this);        stop.setOnClickListener(this);            }    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        switch(v.getId()){        case R.id.start:             //调用Handler的post方法,将要执行的线程对象添加到线程队列中            myHandler.post(threadRunnable);            break;        case R.id.stop:            myHandler.removeCallbacks(threadRunnable);            break;        }    }        Runnable threadRunnable = new Runnable() {        //将要执行的操作写入run方法中。        @Override        public void run() {            // TODO Auto-generated method stub            System.out.println("run");            //在run方法内部,执行postXX的方法,每隔1秒会执行一次 (定时操作)             myHandler.postDelayed(threadRunnable, 1000);        }    };}

(2)更新UI
其实还不是很明白为什么要使用post来把一个Runnable对象加入到消息队列进行处理,也没有开启新的线程,这样做的目的是什么?
public class MainActivity extends Activity implements OnClickListener{        private Button start = null;    private Button stop = null;    private ProgressBar bar = null;        Handler myHandler = new Handler(){        public void handleMessage(Message msg){            bar.setProgress(msg.arg1);            myHandler.post(threadRunnable);        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                start = (Button)findViewById(R.id.start);        stop = (Button)findViewById(R.id.stop);        bar = (ProgressBar)findViewById(R.id.bar);                start.setOnClickListener(this);        stop.setOnClickListener(this);            }    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        switch(v.getId()){        case R.id.start:             //调用Handler的post方法,将要执行的线程对象添加到消息队列中,不会开启一个新的线程,只是执行run方法。            myHandler.post(threadRunnable);            break;        case R.id.stop:            myHandler.removeCallbacks(threadRunnable);            break;        }    }        Runnable threadRunnable = new Runnable() {        //将要执行的操作写入run方法中。        int i = 0;        @Override        public void run() {            // TODO Auto-generated method stub            i = i+10;            //得到一个消息对象,Message类是由android操作系统提供,            //obtainMessage方法用来得到Message对象             Message msg = myHandler.obtainMessage();            msg.arg1 = i;            try {                //当前线程睡眠1S                Thread.sleep(1000);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            //发送一个消息,用sendMessage将msg加入到消息队列中            myHandler.sendMessage(msg);            if(i>100){                //将线程对象 从handler当中移除                 myHandler.removeCallbacks(threadRunnable);            }        }    };}

(3)线程间通信
其实主要的用途也是更新UI,比如在子线程中执行一个耗时操作,然后把结果返回给主线程等。
public class MainActivity extends Activity implements OnClickListener{    private Handler myHandler = null;    private Button handlerBtn = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        handlerBtn = (Button) findViewById(R.id.btn_handler);        handlerBtn.setOnClickListener(this);        myHandler = new Handler() {            @Override            public void handleMessage(Message msg) {                // TODO Auto-generated method stub                super.handleMessage(msg);                System.out.println("zmq Handler in main Thread");            }        };    }      @Override    public void onClick(View v) {        // TODO Auto-generated method stub        if(v.getId()==R.id.btn_handler){//            myHandler.sendEmptyMessage(111);                        new Thread(new Runnable() {                                @Override                public void run() {                    // TODO Auto-generated method stub                    myHandler.sendEmptyMessage(222);                }            }).start();        }    }}



0 0
原创粉丝点击