Handler的基本用法

1.尝试在子线程中更新UI:

xml文件中:

 <TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

MainActivity.java中:

TextView txt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txt = (TextView)findViewById(R.id.txt);
        new Thread(){
            public void run() {
                try {
                    Thread.sleep(1000);
                    txt.setText("jimo love");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
        }.start();
    }

运行结果:
报错

2.用Handler的post方法解决:

修改MainActivity.java文件:

TextView txt;
    Handler handler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txt = (TextView)findViewById(R.id.txt);

        new Thread(){
            public void run() {
                try {
                    Thread.sleep(1000);
                    handler.post(new Runnable() {

                        @Override
                        public void run() {
                            txt.setText("jimo love");
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
        }.start();
    }

运行结果:
正确

3.Handler的postDelayed方法:

Handler.postDelayed(runnable,time);

含义:隔多少time执行一次runnable;
接下来让TextView每隔一秒钟变一次内容:
代码:

    TextView txt;
    Handler handler = new Handler();
    private int cnt = 0;//计数
    MyRunnable myR = new MyRunnable();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txt = (TextView)findViewById(R.id.txt);
        handler.postDelayed(myR, 1000);
    }
    class MyRunnable implements Runnable{

        @Override
        public void run() {
            cnt++;
            cnt = cnt % 3;
            txt.setText("jimo"+cnt);
            handler.postDelayed(myR, 1000);
        }
    }

运行结果不言而喻。

4.Handler的handleMessage方法:

可以直接用message自带的两个参数传递参数:

    TextView txt;
    Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            txt.setText(""+msg.arg1+" "+msg.arg2);
        };
    };

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

        txt = (TextView)findViewById(R.id.txt);
        new Thread(){
            public void run() {
                Message ms = new Message();
                ms.arg1 = 100;
                ms.arg2 = 80;
                handler.handleMessage(ms);
            };
        }.start();
    }

运行结果:
100

但是如果有多个参数,可以创建一个对象来传递,这就用到Message对象的另一个属性:msg.obj:

    TextView txt;
    Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            txt.setText(""+msg.obj);
        };
    };
    class Car{
        //为了方便就不封装了
        public String name;
        public float price;
        @Override
        public String toString() {
            return "name: "+name+" price: "+price;
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txt = (TextView)findViewById(R.id.txt);
        new Thread(){
            public void run() {
                Message ms = new Message();
                Car car = new Car();
                car.name = "东风";
                car.price = (float) 100.8;
                ms.obj = car;
                handler.handleMessage(ms);
            };
        }.start();
    }

运行结果:
车
当然,我们也可以通过handler.obtainMessage()方法拿到message对象

        public void run() {
                //Message ms = new Message();
                Message ms = handler.obtainMessage();
                Car car = new Car();
                car.name = "东风";
                car.price = (float) 100.8;
                ms.obj = car;
                handler.handleMessage(ms);
            };

然而,我们还可以通过message的sendToTarget()方法发送消息:

ms.obj = car;
ms.sendToTarget();
//handler.handleMessage(ms);

运行结果都是一样的。

5.Handler的removeCallbacks()方法:

可以移除一个handler事件,如上例3,增加一个Button按钮,但点击按钮,则移除MyRunnable事件:

        btn_remove = (Button)findViewById(R.id.btn_remove);

        btn_remove.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                handler.removeCallbacks(myR);
            }
        });

6.Handler的CallBack函数:
当callback函数返回true时,只会打印yes,返回false时yes和no都会打印,所以可以在callback里执行逻辑,不成功时执行后面的handleMessage:

    TextView txt;
    Button btn_remove;
    Callback call = new Callback() {

        @Override
        public boolean handleMessage(Message msg) {
            Toast.makeText(getApplicationContext(), "yes", Toast.LENGTH_SHORT).show();
            return true;
        }
    };
    Handler handler = new Handler(call){
        @Override
        public void handleMessage(Message msg) {
            Toast.makeText(getApplicationContext(), "no", Toast.LENGTH_SHORT).show();
        }
    };
    private int cnt = 0;//计数
    MyRunnable myR = new MyRunnable();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txt = (TextView)findViewById(R.id.txt);
        btn_remove = (Button)findViewById(R.id.btn_remove);

        btn_remove.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                handler.sendEmptyMessage(1);
            }
        });

//      handler.postDelayed(myR, 1000);
    }
    class MyRunnable implements Runnable{

        @Override
        public void run() {
            cnt++;
            cnt = cnt % 3;
            txt.setText("jimo"+cnt);
            handler.postDelayed(myR, 1000);
        }
    }

版权声明:本文为jimo_lonely原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。