消息机制和UI处理

来源:互联网 发布:梦幻西游外部网络错误 编辑:程序博客网 时间:2024/05/04 13:06

Android中需要在主线程中处理UI问题。通过Handler处理消息。
具体说明见示例。

LooperThread.java

    class LooperThread extends Thread {        public Handler mHandler;        public TextView tv;        public LooperThread(TextView tv, Handler mHandler) {            this.tv = tv;            this.mHandler = mHandler;        }        @Override        public void run() {            //子线程的looper不是默认开启的,需要先调用prepare()方法            Looper.prepare();            Log.d("zhty", "thread Thread.currentThread().getId():" + Thread.currentThread().getId());            Log.d("zhty", "prepare");            mHandler = new Handler() {                @Override                public void handleMessage(Message msg) {                    //这里会报错//                  tv.setText("线程的handler不可以处理UI");                    Looper.myLooper().quit();                }            };            Log.d("zhty", "Looper.myLooper():" + Looper.myLooper());            //就是构造时传入的looper            Log.d("zhty", "mHandler.getLooper():" + mHandler.getLooper());            Log.d("zhty", "Looper.getMainLooper():" + Looper.getMainLooper());            //post()的方式.也是封装成message发送到线程的消息队列             mHandler.post(new Runnable() {                 @Override                 public void run() {                     tv.setText("post的方式处理,发送到了消息队列里");                 }            });            Log.d("zhty", "loop");            //sendMessage()的方式            new Thread(new Runnable() {                @Override                public void run() {                    Log.d("zhty", "thread in thread Thread.currentThread().getId():" + Thread.currentThread().getId());                    Message msgMessage = new Message();                    mHandler.sendMessage(msgMessage);                }            }).start();            //阻塞的方法,调用quit()方法结束            Looper.loop();            Log.d("zhty", "after loop");        }    }

调用方法:

    public void handlerTest() {        final TextView tv = (TextView) findViewById(R.id.tv);        Log.d("zhty", "main Thread.currentThread().getId():" + Thread.currentThread().getId());        //在主线程创建Handler,默认传入的是Looper.getMainLooper        Handler mHandler = new Handler() {            @Override            public void handleMessage(Message msg) {                tv.setText("主线程的handler可以处理UI");                //主线程的looper不可以执行quit()//              Looper.myLooper().quit();            }        };        new LooperThread(tv, mHandler).start();    }
1 0
原创粉丝点击