zoukankan      html  css  js  c++  java
  • 异步消息处理机制 简析

    1。什么是异步消息处理?

    答:对于普通的线程来说,执行完run()方法内的代码后线程就结束了。而异步消息处理线程是指:线程启动后会进入一个无限循环体之中,每执行一次,从线程内部的消息队列中取出一个消息,并回调相应的消息处理函数,执行完一个消息后则继续循环。如果消息队列为空,线程会暂停(一般也就是我们调用休眠方法),直到消息队列中又新的消息。

    2.什么时候使用异步消息处理?

    答:当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉。Handler就是把这些功能放到一个单独的线程里执行,与Activity互不影响。因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。

    3.android中异步消息处理由四部分组成,Message,Handler,MessageQueue,Looper。

    a.Message:

        Message是在线程中传递的消息,它可以在内部携带少量的信息,用于在不同的线程间交换数据。

    b.Handle:

        Handle主要用于发送和处理消息。发送消息一般使用的是SendMessage()方法,而发送的消息经过一系列的处理后,最终会传到Handle的Message()方法中。

    c.MessageQueue

        MessageQueue是消息队列的意思,主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程只会有一个MessageQueue对象。

    d。Looper

       调用Looper中的loop()方法后,就会进入一个无限循环中,每当发现MessageQueue中存在的一条消息,就会将他取出,并传递到Hander的handleMessage()方法中。每个线程也都会有一个Looper对象

    4.简单的例子:

    public class MainActivity extends ActionBarActivity {
        
        public static final int UPDATE_TEXT=1;
        
        private Button button;
        
        private TextView text;
        
        private Handler handler=new Handler(){
            public void handleMessage(Message msg){
                switch (msg.what) {
                case UPDATE_TEXT:
                    
                    text.setText("Nice to meet you");
                    
                    break;
    
                default:
                    break;
                }
            }
            
        };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            button = (Button)findViewById(R.id.change_text);
            text = (TextView)findViewById(R.id.text);
            
            ButtonListener listener=new ButtonListener();
            button.setOnClickListener(listener);
        }
        
        
        
        class ButtonListener implements OnClickListener{
    
            @Override
            public void onClick(View v) {
                
                switch (v.getId()) {
                case R.id.change_text:
                    
                    new Thread(new Runnable() {
                        
                        @Override
                        public void run() {
                            
                            Message message=new Message();
                            message.what=UPDATE_TEXT;
                            handler.sendMessage(message);
                            
                        }
                    }).start();
                    
                    break;
    
                default:
                    break;
                }
                
            }
            
        }
    }
  • 相关阅读:
    IOS UIPickView+sqlite 选择中国所有城市案例
    IOS Sqlite用户界面增删改查案例
    IOS sqlite数据库增删改查
    IOS基于新浪微博开放平台微博APP
    ASIHTTPRequest 对GET POST 请求简单封装
    装饰器模式
    策略模式
    网站加入QQ聊天链接
    Spring AOP详解
    Maven搭建多模块企业级项目
  • 原文地址:https://www.cnblogs.com/mercuryli/p/4509875.html
Copyright © 2011-2022 走看看