您的位置:首页 > 移动开发 > Android开发

Android之Handler详解

2015-10-27 12:35 513 查看
sendMessage版本的Handler的使用

这里介绍几种模型:

a、默认的Handler(消息处理队列挂在主线程上)

 Java代码 

 





[java] view
plaincopy

<span style="font-size:16px;">    package com.dxyh.test;     

        

    import android.app.Activity;     

    import android.os.Bundle;     

    import android.os.Handler;     

    import android.os.Message;     

    import android.util.Log;     

    import android.view.View;     

    import android.view.View.OnClickListener;     

    import android.widget.Button;     

        

    public class MainActivity extends Activity     

                      implements OnClickListener {     

        private final static String TAG = "HandlerTest";     

             

        private final static int TASK_BEGIN = 1;     

        private final static int TASK_1 = 2;     

        private final static int TASK_2 = 3;     

        private final static int TASK_END   = 4;     

             

        private Button btnStart = null;     

        private Button btnStop = null;     

             

        /** Called when the activity is first created. */    

        @Override    

        public void onCreate(Bundle savedInstanceState) {     

            super.onCreate(savedInstanceState);     

            setContentView(R.layout.main);     

                 

            btnStart = (Button) findViewById(R.id.btn_start);     

            btnStart.setOnClickListener(this);     

            btnStop = (Button) findViewById(R.id.btn_stop);     

            btnStop.setOnClickListener(this);     

                 

            Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]");     

        }     

             

        Handler mHandler = new Handler() {     

            // 注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框     

            @Override    

            public void handleMessage(Message msg) {     

                switch (msg.what) {     

                case TASK_BEGIN:     

                    Log.i(TAG, "[H_TID:" +     

                        Thread.currentThread().getId() + "] Get TASK_BEGIN");     

                    break;     

                         

                case TASK_1:     

                    Log.i(TAG, "[H_TID:" +     

                        Thread.currentThread().getId() + "] Get TASK_1");     

                    break;     

                         

                case TASK_2:     

                    Log.i(TAG, "[H_TID:" +     

                        Thread.currentThread().getId() + "] Get TASK_2");     

                    break;     

                         

                case TASK_END:     

                    Log.i(TAG, "[H_TID:" +     

                        Thread.currentThread().getId() + "] Get TASK_END");     

                    finish();     

                    break;     

                }     

                super.handleMessage(msg);     

            }     

        };     

             

        public void onClick(View view) {     

            switch (view.getId()) {     

            case R.id.btn_start:     

                // 启动任务(消息只有标识,立即投递)     

                mHandler.sendEmptyMessage(TASK_BEGIN);     

                Log.i(TAG, "Send TASK_BEGIN to handler.");     

                     

                // 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)     

                Message msg1 = mHandler.obtainMessage(TASK_1);     

                msg1.obj = "This is task1";     

                mHandler.sendMessage(msg1);     

                Log.i(TAG, "Send TASK_1 to handler.");     

                     

                // 开启任务2(和上面类似)     

                Message msg2 = Message.obtain();     

                msg2.arg1 = 10;     

                msg2.arg2 = 20;     

                msg2.what = TASK_2;     

                mHandler.sendMessage(msg2);     

                Log.i(TAG, "Send TASK_2 to handler.");     

                break;     

                     

            case R.id.btn_stop:     

                // 结束任务(空消息体,延时2s投递)     

                mHandler.sendEmptyMessageDelayed(TASK_END, 2000);     

                Log.i(TAG, "Send TASK_END to handler.");     

                break;     

            }     

    }     

    }  </span>  

运行结果:



b、消息队列仍绑定在主线程上,但在子线程中发送消息。
Java代码 

 



[java] view
plaincopy

<span style="font-size:16px;">    package com.dxyh.test;     

        

    import android.app.Activity;     

    import android.os.Bundle;     

    import android.os.Handler;     

    import android.os.Message;     

    import android.util.Log;     

        

    public class MainActivity extends Activity {     

        private final static String TAG = "HandlerTest";     

             

        private final static int TASK_BEGIN = 1;     

        private final static int TASK_1 = 2;     

        private final static int TASK_2 = 3;     

        private final static int TASK_END   = 4;     

             

        /** Called when the activity is first created. */    

        @Override    

        public void onCreate(Bundle savedInstanceState) {     

            super.onCreate(savedInstanceState);     

            setContentView(R.layout.main);     

                 

            Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +     

                    "This is in main thread.");     

                 

            workThread.start();     

        }     

             

        Handler mHandler = new Handler() {     

            // 注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框     

            @Override    

            public void handleMessage(Message msg) {     

                switch (msg.what) {     

                case TASK_BEGIN:     

                    Log.i(TAG, "[H_TID:" +     

                    Thread.currentThread().getId() + "] Get TASK_BEGIN");     

                    break;     

                         

                case TASK_1:     

                    Log.i(TAG, "[H_TID:" +     

                    Thread.currentThread().getId() + "] Get TASK_1");     

                    break;     

                         

                case TASK_2:     

                    Log.i(TAG, "[H_TID:" +     

                    Thread.currentThread().getId() + "] Get TASK_2");     

                    break;     

                         

                case TASK_END:     

                    Log.i(TAG, "[H_TID:" +     

                    Thread.currentThread().getId() + "] Get TASK_END");     

                    finish();     

                    break;     

                }     

                super.handleMessage(msg);     

            }     

        };     

             

        Thread workThread = new Thread() {     

            // 你可以在run方法内做任何耗时的操作,然后将结果以消息形式投递到主线程的消息队列中     

            @Override    

            public void run() {     

                // 启动任务(消息只有标识,立即投递)     

                mHandler.sendEmptyMessage(TASK_BEGIN);     

                Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +     

                        "Send TASK_START to handler.");     

                     

                // 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)     

                Message msg1 = mHandler.obtainMessage(TASK_1);     

                msg1.obj = "This is task1";     

                mHandler.sendMessage(msg1);     

                Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +     

                        "Send TASK_1 to handler.");     

                     

                // 开启任务2(和上面类似)     

                Message msg2 = Message.obtain();     

                msg2.arg1 = 10;     

                msg2.arg2 = 20;     

                msg2.what = TASK_2;     

                mHandler.sendMessage(msg2);     

                Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +     

                        "Send TASK_2 to handler.");     

                     

                // 结束任务(空消息体,延时2s投递)     

                mHandler.sendEmptyMessageDelayed(TASK_END, 2000);     

                Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +     

                        "Send TASK_END to handler.");     

            }     

        };     

    }    

  

</span>  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: