图解 Android Handler 线程消息机制(3)

首先将要使用的数据类型声明在头部,将会使用到 java 的 Thread 和Android Handler 对象,首先实现Runable 对象,代码如下:

Runablerun = new Runnable() {

@Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    int i = 0;
                    do {
                        i++;
                        Thread.sleep(i > 15 ? 20 : 100);
                        Message msg = handler.obtainMessage();
                        msg.arg1 = i;
                        msg.sendToTarget();
                        if (i == textLength) {
                            isStop = false;
                        }
                    } while (isStop);
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        }; 

上面代码还可以如此写法: 

Message msg=new Message();
    msg.arg1=i;
    handler.sendMessage(msg); 

第一种写法是message 从handler 类获取,从而可以直接向该handler 对象发送消息,第二种写法是直接调用 handler 的发送消息方法发送消息。不过不管是第一种方法好还是第二种方法好,都要在同样的handler 接收消息,否则会报异常。下面实现handler 对象,代码如下:

/**
     * 启动线程
     *
     * @param tv
     * @param text
     * @return
     */
    public Handler getHandler(final TextView tv, final String text) {
        Handler hand = new Handler() {
            public void handleMessage(Message msg) {

tv.setText(text.substring(0, text.length() - msg.arg1));

super.handleMessage(msg);
            };
        };
        return hand;

这里返回一个handler 对象,实际上是返回去给上面我们的handler 对象使用,这里我把它封装成一个方法,可以让它在每次接收到消息后去使用消息处理文本每次减1

设置的 onTouch 事件,使其在弹出时停止递减: 

/**
     * 点击back删除之前的数据,跳出就停止删除
     */
    OnTouchListener ontouch = new OnTouchListener() {

@Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
           
            String text = tv_call_no.getText().toString();
            if (text.length() == 0) {
                isStop = false;
                return false;
            }
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                isStop = true;
                textLength = tv_call_no.getText().length();
               
                handler = getHandler(tv_call_no, text);
                thread = new Thread(Runablerun);
                thread.start();
                break;
            case MotionEvent.ACTION_UP:
                isStop = false;
                break;

}
            return false;
        }
    }; 

小结:

1、向哪个Handler 发送消息,就必须在哪个handler 里面接收;
2、直接使用JAVA 的 Thread 是无法更新Android UI的,因为Android View 在设计的时线程是不完全的,不过Android 提供了几种供开发者在线程中更新UI的方法,如下:

Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
3、直接使用hanlder .post 等方法是在当前主线程里面做操作,而不是另外新建线程,建议使用Thread 线程直接新建另外一个线程或者使用HandlerThread类也可以。
4、记住消息队列的先进先出原则。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwssjf.html