Android Handler使用大全

来源:互联网 发布:瑞典难民知乎 编辑:程序博客网 时间:2024/06/03 21:19

首先说一下Handler是如何传递数据的
1.他可以发送空的Message来传递数据,

        handler1 = new Handler(){            public void handleMessage(android.os.Message msg) {                tv.setText(msg.what+"");            }        };handler1.sendEmptyMessage(1);
  1. 通过Message来传递数据
        handler2 = new Handler(){            public void handleMessage(android.os.Message msg) {                switch (msg.arg1) {                    case 1:                        Bundle a=msg.getData();                        String b=a.getString("shuchu");                        tv.setText(b);                        break;                    default:                        break;                }            };        };        btn2.setOnClickListener(new View.OnClickListener()        {            @Override            public void onClick(View v)            {                Message msg = handler2.obtainMessage();                Bundle bundle = new Bundle();                bundle.putString("shuchu", "Thread:" + Thread.currentThread().getId() + " activeCount:" + Thread.activeCount());// 将服务器返回的订单号传到Bundle中,,再通过handler传出                msg.setData(bundle);                msg.arg1=1;                handler2.sendMessage(msg);            }        });

3.我们知道handler能够切换线程,但是都是通过发送Message来完成,但是还可以使用post函数来切换线程,这个post换成其他控件可以使用

handler3 = new Handler();    class DownloadThread extends Thread{        @Override        public void run() {            try{                Thread.sleep(5000);                Runnable runnable = new Runnable() {                    @Override                    public void run() {                        tv.setText("Handler还可以通过post命令来切换到自己所属线程");                    }                };                handler3.post(runnable);            }catch (InterruptedException e){                e.printStackTrace();            }        }    }                DownloadThread downloadThread = new DownloadThread();                downloadThread.start();

4.传递对象

        handler4 = new Handler(){            @Override            public void handleMessage(Message msg) {                // TODO Auto-generated method stub                super.handleMessage(msg);                if (msg.obj != null)                {                    Drawable drawable = (Drawable) msg.obj;                    tv .setBackgroundDrawable(drawable);                }            }        };                Drawable drawable = MainActivity.this.getDrawable(R.mipmap.ic_launcher);                //1、实例化一个Message对象                Message message = Message.obtain();                //将图片流赋值给Message对象                message. obj = drawable;                //定义标签                message. what = 0;                //3、发送消息到主线程中的Handler                handler4 .sendMessage(message);

5.他还可以延缓Message的发送

handler4.sendMessageDelayed(message,3000);

6.post函数也可以延缓

handler3.postDelayed(runnable,3000);
  1. 取消Message,为了防止Handler造成内存泄漏,就是占着对象使得对象的内存无法释放
        handler1.removeCallbacksAndMessages(null);        handler2.removeCallbacksAndMessages(null);        handler1.removeCallbacksAndMessages(null);        handler1.removeCallbacksAndMessages(null);