AsyncTask 适用于单线程任务处理,多任务处理还是 Message/Handler 处理方便一些

主要使用方式:

1,创建子类继承自 Handler 类,覆盖 handleMessage(Message) 方法,switch Message 对象的 what(int 类型) 域等携带的信息,用于在 UI 线程中进行对应的操作;

2,new 一个 Handler 对象,并保存,之后发送 Message 对象会用到;

3,子线程中进行耗时操作,完成后 new 一个 Message 对象,设置 what, obj(可选)域;

4,使用 Handler 对象的 sendMessage(Message) 方法即可将 Message 发送给 Handler 对象。

这看起来像是回调,不过差异还是挺大的。主要的区别就是 Handler 对象的 sendMessage(Message) 方法只是通知 Handler 对象,之后 handlerMessage(Message) 会自动在 UI 线程中被调用,而直接调用对应方法则不会回到 UI 线程。

package club.seliote.demo;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView; import java.util.Random; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private static final int MESSAGE_UPDATE_0 = 0;
private static final int MESSAGE_UPDATE_1 = 1;
private static final int MESSAGE_UPDATE_2 = 2;
private static final int MESSAGE_UPDATE_3 = 3; private TextView mTextView; private Handler mHandler; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
this.mTextView = (TextView) this.findViewById(R.id.text_view);
/**
* Step 2
*/
this.mHandler = new DownloadHandler();
this.download();
} private void download() {
for (int i = 0; i < 100; i++) {
/**
* Step 3
*/
new Thread(() -> {
try {
// 模拟下载
Thread.sleep((long) (Math.random() * 10000));
}
catch (InterruptedException interruptedException) {
Log.e(TAG, Thread.currentThread().getId() + " had interrupted!");
Message message = new Message();
message.what = 4;
message.obj = this.mTextView;
this.mHandler.sendMessage(message);
return;
}
Message message = new Message();
message.what = new Random().nextInt(4);
message.obj = this.mTextView;
/**
* Step 4
*/
this.mHandler.sendMessage(message);
}).start();
}
} /**
* Step 1
*/
private class DownloadHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 判断具体的消息类型,进行相应处理
switch (msg.what) {
case MainActivity.MESSAGE_UPDATE_0:
// Object 类型参数可以用来传递要更新的对象
((TextView)(msg.obj)).setText("000000");
((TextView)(msg.obj)).setTextColor(MainActivity.this.getResources().getColor(R.color.red));
break;
case MainActivity.MESSAGE_UPDATE_1:
((TextView)(msg.obj)).setText("111111");
((TextView)(msg.obj)).setTextColor(MainActivity.this.getResources().getColor(R.color.black));
break;
case MainActivity.MESSAGE_UPDATE_2:
((TextView)(msg.obj)).setText("222222");
((TextView)(msg.obj)).setTextColor(MainActivity.this.getResources().getColor(R.color.blue));
break;
case MainActivity.MESSAGE_UPDATE_3:
((TextView)(msg.obj)).setText("333333");
((TextView)(msg.obj)).setTextColor(MainActivity.this.getResources().getColor(R.color.grey));
break;
default:
((TextView)(msg.obj)).setText("-1-1-1-1-1-1");
((TextView)(msg.obj)).setTextColor(MainActivity.this.getResources().getColor(R.color.colorAccent));
break;
}
}
}
}

异步消息处理(Message, Handler, MessageQueue, Looper)的更多相关文章

  1. (转)Android消息处理机制(Handler、Looper、MessageQueue与Message)

    转自 http://www.cnblogs.com/angeldevil/p/3340644.html Android消息处理机制(Handler.Looper.MessageQueue与Messag ...

  2. Android开发之异步消息处理机制Handler

    更加详细的介绍Handler的博文-http://blog.csdn.net/guolin_blog/article/details/9991569 Android中的异步消息处理主要有四个部分组成, ...

  3. [转]Handler MessageQueue Looper消息循环原理分析

    Handler MessageQueue Looper消息循环原理分析   Handler概述 Handler在Android开发中非常重要,最常见的使用场景就是在子线程需要更新UI,用Handler ...

  4. Android消息处理机制(Handler、Looper、MessageQueue与Message)

    Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...

  5. Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)

    前言 如果你在阅读本文之前,你不知道Handler在Android中为何物,我建议你先看看本系列的第一篇博文<Android:异步处理之Handler+Thread的应用(一)>:我们都知 ...

  6. 异步消息处理机制Handler

    Android 中的异步消息处理主要由四个部分组成,Message.Handler.MessageQueue 和Looper. 1. Message Message 是在线程之间传递的消息,它可以在内 ...

  7. Android Handler MessageQueue Looper 消息机制原理

    提到Android里的消息机制,便会提到Message.Handler.Looper.MessageQueue这四个类,我先简单介绍以下这4个类 之间的爱恨情仇. Message 消息的封装类,里边存 ...

  8. 异步消息处理机制——Handler用法

    Handler 1. Message Messsge是线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据,Message的what字段,除此之外还可以使用arg1和arg2字段 ...

  9. Handler 、 Looper 、Message异步消息处理线程机制( hander消息机制原理)

    Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念. 那么什么叫异步消息处理线程呢? 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次, ...

随机推荐

  1. WIN10安装VS2013出现兼容性问题解决

    在WIN10安装VS2013时,会提示“windows程序兼容模式已打开”,通过搜索引擎搜索的常见方案为: 1.使用命令行安装,进入vs_ultimate文件所在目录,输入:vs_ultimate / ...

  2. 【图文详解】Zookeeper集群搭建(CentOs6.3)

    Zookeeper简介: Zookeeper是一个分布式协调服务,就是为用户的分布式应用程序提供协调服务的. A.zookeeper是为别的分布式程序服务的 B.Zookeeper本身就是一个分布式程 ...

  3. hdu-2582 f(n)---找规律+素数筛法

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2582 题目大意: 给出公式Gcd(n)=gcd(C[n][1],C[n][2],……,C[n][n- ...

  4. bzoj2003 [Hnoi2010]矩阵

    Description Input 第一行包含三个正整数N M P表示矩阵的行数列数以及每个数的范围,接下来N行每行包含M个非负整数,其中第i行第j个数表示以格子(i,j)为右下角的2*2子矩阵中的数 ...

  5. caffe的卷积层的乘积运算的优化

    https://hal.inria.fr/file/index/docid/112631/filename/p1038112283956.pdf caffe的卷积计算的优化来自这篇paper,实际上就 ...

  6. Android学习笔记_39_tween动画的实现(Animation和Frame)

    一.Animation动画的实现及特点: 1.Tween动画,通过对 View 的内容进行一系列的图形变换 (包括平移.缩放.旋转.改变透明度)来实现动画效果.   动画效果的定义可以采用XML来做也 ...

  7. 学习Promise笔记

    什么是Promise? MDN对Promise的定义:Promise对象用于异步操作,它表示一个尚未完成且预计在未来完成的异步操作. 在学习Promise之前得先了解同步与异步:JavaScript的 ...

  8. C++练习--实现客户机(CLIENT)类

    实现客户机(CLIENT)类. 定义字符型静态数据成员SeverName,保存其服务器名称: 整型静态数据成员ClientNum,记录已定义的客户数量: 定义静态函数ChangeSeverName() ...

  9. POJ 1180 Batch Scheduling (dp,双端队列)

    #include <iostream> using namespace std; + ; int S, N; int T[MAX_N], F[MAX_N]; int sum_F[MAX_N ...

  10. 独木舟(51NOD 1432 )

    n个人,已知每个人体重.独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? Input 第一行包含 ...