在Android中为了执行一些耗时的操作,但有不想因此导致主线程堵塞的时候,就必须通过多线程的方式来处理。

在Java中主要有以下两种生成子线程的方法:

方法一:

class MyThread extends Thread {@Overridepublic void run() {// 处理具体的逻辑}}new MyThread().start();

方法二:

class MyThread implements Runnable {@Overridepublic void run() {// 处理具体的逻辑}}MyThread myThread = new MyThread();new Thread(myThread).start();

当然,第二种方法使用匿名类的方式将会更加简洁。


Android中,禁止在主线程之外的线程中直接更新UI(android中的UI操作线程不安全),所以当我需要在子线程中处理UI的操作以减轻主线程负担的时候,我们考虑使用Android中提供的异步处理方式。

这里我给出一个代码实例:

UI部分:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <Button        android:layout_marginTop="5dp"        android:layout_gravity="center_horizontal"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="红楼梦"        android:id="@+id/change_button" />    <ImageView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:id="@+id/imageView" /></LinearLayout>

Activity部分:

public class MainActivity extends Activity implements View.OnClickListener {    private ImageView imageView;    private Button changeButton;    //图片id    private int[] choose = {R.drawable.dream1, R.drawable.dream2,R.drawable.dream3, R.drawable.dream4,R.drawable.dream5};    //记录更新    private static final int UPDATE_IMAGE = 1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main_layout);        imageView = (ImageView) findViewById(R.id.imageView);        changeButton = (Button) findViewById(R.id.change_button);        changeButton.setOnClickListener(this);    }    private Handler handler = new Handler(){        //通过重写的handleMessage获取msg        @Override        public void handleMessage(Message msg) {            switch (msg.what) {                case UPDATE_IMAGE:                    // 对比指令后,在这里可以进行UI操作                    imageView.setImageResource(choose[Math.abs(new Random().nextInt())%5]);                    break;                default:                    break;            }        }    };    public void onClick(View v){        switch (v.getId()){            case R.id.change_button:                new Thread(new Runnable() {                    //开启子线程发送一个Message                    @Override                    public void run() {                        Message message = new Message();                        message.what = UPDATE_IMAGE;                        handler.sendMessage(message);                    }                }).start();                break;            default:                break;        }    }}
实现效果图:


Android 中的异步消息处理主要由四个部分组成,Message、Handler、MessageQueue 和Looper。
1. Message
Message 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。除了 Message 的 what 字段,还可以使用 arg1 和 arg2 字段来携带一些整型数据,使用 obj 字段携带一个 Object 对象。
2. Handler
Handler 顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消息一般是使用 Handler 的 sendMessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到 Handler 的 handleMessage()方法中。
3. MessageQueue
MessageQueue 是消息队列的意思,它主要用于存放所有通过 Handler 发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个 MessageQueue对象。
4. Looper
Looper 是每个线程中的 MessageQueue 的管家,调用 Looper 的 loop()方法后,就会进入到一个无限循环当中,然后每当发现 MessageQueue 中存在一条消息,就会将它取出, 并传递到 Handler 的 handleMessage()方法中。 每个线程中也只会有一个 Looper 对象。

流程:

1)首先需要在主线程当中创建一个 Handler 对象,并重写handleMessage()方法。

2)然后当子线程中需要进行UI 操作时,就创建一个 Message 对象,并通过 Handler 将这条消息发送出去。

3)之后这条消息会被添加到 MessageQueue 的队列中等待被处理,而 Looper 则会一直尝试从 MessageQueue 中取出待处理消息,最后分发回 HandlerhandleMessage()方法中。

由于 Handler 是在主线程中创建的,所以此时 handleMessage()方法中的代码也会在主线程中运行,于是我们在这里就可以安心地进行 UI 操作了。


最后给出一张流程图:


更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android(安卓)10.0 Activity启动详解(二)
  3. Android由一个activity 间隔5秒自动跳转到另外一个activity
  4. android相机Camera.Parameters所有的参数值
  5. Android快速开发框架dyh详解(四)---数据层的使用
  6. Android编程调试Log类使用详解
  7. Android第三方文件选择器aFileChooser使用方法详解
  8. Android中SQLite开发详解(四)SQLiteOpenHelper 类和SQLiteDatabase
  9. Android(安卓)Studio常用快捷键、Android(安卓)Studio快捷键大全

随机推荐

  1. Android(安卓)属性系统设计分析
  2. 【Android基础笔记01】Android开发环境搭
  3. Qt on Android:应用截屏
  4. android触摸事件分发与处理简述
  5. Android(安卓)读写文件
  6. 史上最全的Android开发学习教程集锦【初
  7. Android从零单排——前言
  8. Android(安卓)ImageView 的scaleType 属
  9. Android项目构建Apk包流程
  10. Android整理笔记——1.3.2.1自定义view的