Android学习之多线程编程(handler篇)
2015-12-30 19:58
537 查看
在Android中为了执行一些耗时的操作,但有不想因此导致主线程堵塞的时候,就必须通过多线程的方式来处理。
在Java中主要有以下两种生成子线程的方法:
方法一:
方法二:
当然,第二种方法使用匿名类的方式将会更加简洁。
Android中,禁止在主线程之外的线程中直接更新UI(android中的UI操作线程不安全),所以当我需要在子线程中处理UI的操作以减轻主线程负担的时候,我们考虑使用Android中提供的异步处理方式。
这里我给出一个代码实例:
UI部分:
Activity部分:
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
中取出待处理消息,最后分发回
Handler的
handleMessage()方法中。
由于
Handler
是在主线程中创建的,所以此时
handleMessage()方法中的代码也会在主线程中运行,于是我们在这里就可以安心地进行
UI 操作了。
最后给出一张流程图:
在Java中主要有以下两种生成子线程的方法:
方法一:
class MyThread extends Thread { @Override public void run() { // 处理具体的逻辑 } } new MyThread().start();
方法二:
class MyThread implements Runnable { @Override public 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
中取出待处理消息,最后分发回
Handler的
handleMessage()方法中。
由于
Handler
是在主线程中创建的,所以此时
handleMessage()方法中的代码也会在主线程中运行,于是我们在这里就可以安心地进行
UI 操作了。
最后给出一张流程图:
相关文章推荐
- 学习Android从0开始之背景篇-Android系统介绍
- 《Monkey Android》第12课ImageView
- Launcher和LauncherModel之间的数据交互
- 用Android Studio通过Java代码调用C代码的JNI流程
- Android中开启进程的方法
- Android 自定义布局—瀑布流
- 学习Android从0开始之开发工具篇-Android studio详解
- Android Studio很实用的调试技巧
- Android动画
- material design学习之杂记
- Android快速入门(2016版一步步图文讲解教程),电梯直达
- Android开发中那些相见恨晚的方法、类、接口、工具
- android 取消listview的默认滑动到顶的效果
- Android Studio快捷键用法
- 2015年十大热门Android开源新项目
- Android 中的Handler机制的深入探究
- ANDROID内存优化(大汇总——上)
- android应用开发--------------看RadioGroup源代码,写相似单选选项卡的集成控件(如底部导航,tab等等)
- ANDROID内存优化(大汇总——中)
- ANDROID内存优化(大汇总——全)