参考:《第一行代码》第9章


Android不允许在子线程中进行UI操作的,而我们有些时候,必须在子线程里去执行一些耗时任务,然后根据任务的执行结果来更新相应的UI控件。

针对这种情况,Android提供了一套异步消息处理机制,可以解决在子线程中进行UI操作的问题


############################################


Andriod 中的异步消息处理主要由四个部分组成,Message、Handler、MessageQueue和Looper.


Message:

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

Message的what、arg1和arg2字段可以携带一些整型数据,使用obj字段可以携带一个Object对象


Handler:

Handler顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消息一般是使用Handler的sendMessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到Handler的handleMessage()方法


MessageQueue:

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


Looper:

Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当发现MessageQueue()中存在一条消息,就会将它去除,并传递到Handler的handleMessage()方法中。每个线程也只会有一个Looper对象。


异步消息处理的整个流程:

首先需要在主线程当中创建一个Handler对象,并重写handleMessage()方法。然后当子线程中需要进行UI操作时,就创建一个Message对象,并通过Handler将这条消息发送出去。之后这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,最后分发回Handler的handleMessage方法中。由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,所以可以安心的进行UI操作。


一条Message经过上述流程的辗转调用后,也就从子线程进入到了主线程,从不能更新UI变成了可以更新UI,整个异步消息处理的核心思想就是如此


#############################################################33


案例:在子线程中更新UI


新建一个AndroidThreadTest项目,然后修改activity_main.xml中的代码:

    

布局文件中定义了两个控件,TextView用于在屏幕的正中央显示一个Hello World字符串,Button用于改变TextView中显示的内容


修改MainActivity:

package com.example.administrator.androidthreadtest;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity implements View.OnClickListener {    private TextView text;    private Button changeText;    public static final int UPDATE_TEXT = 1;    private Handler handler =new Handler() {        public void handleMessage(Message msg) {            switch (msg.what) {                case UPDATE_TEXT:                    //进行UI操作                    text.setText("Nice to meet you");                    break;                default:                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        text = (TextView)findViewById(R.id.text);        changeText = (Button)findViewById(R.id.change_text);        changeText.setOnClickListener(this);    }    @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); //将Message对象发送出去                    }                }).start();                break;            default:                break;        }    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        //noinspection SimplifiableIfStatement        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }}


定义一个整型常量UPDATE_TEXT,用于表示更新TextView动作。然后新增一个Handler对象,并重写父类的handleMessage()方法,在这里对具体的Message进行处理。如果发现Message的what字段的值等于UPDATE_TEXT,就将TextView显示的内容改成Nice to meet you







更多相关文章

  1. Android(安卓)异步加载解决方案
  2. Android之消息推送实现
  3. android的Handler
  4. AsyncTask的用法
  5. Android(安卓)高性能编码一:多线程并发或分布式提高TPS
  6. android 多线程
  7. Android消息处理机制:源码剖析Handler、Looper,并实现图片异步加载
  8. Android(安卓)开发必读:如何成为一名优秀的Android开发者
  9. Android(安卓)—— 静态AsyncTask解决内存泄漏

随机推荐

  1. Android 可拖动的进度条:SeekBar之简单使
  2. 菜鸟窝-仿京东淘宝项目学习笔记(二)ToolBar
  3. MediaPlayer源码存在的内存泄漏问题,释放
  4. Android进程间(IPC机制)通信(Bundler,Messe
  5. 从零开始的Android新项目10 - React Nati
  6. Android自定义控件---打造不一样的FlowLa
  7. Android中bindService的细节之二:从进程的
  8. 微信抢红包插件与Android辅助功能
  9. Android开发之MOB短信验证SDK的使用(二)
  10. Android 调用摄像头录视频,用前摄像头预览