android几种异步处理情况笔记

Handler类:
1 在子线程中发送Message
2 在主线程中获取、处理Message

在新线程中 通过Handler机制通知UI线程改变界面。

每个线程只能拥有一个Looper,而每个Looper关联一个MessageQueue

UI线程中,系统默认初始化了一个Looper对象。

Looper、MessageQueue、Handler的作用如下:
1 Looper: 每个线程只有一个Looper,它负责管理MessageQueue;通过Looper.loop()方法会不断从MssageQueue中取出Message且通过msg.target.dispatchMessage(msg)分发Message给对应的Handler;
2 MessageQueue:由Looper负责管理,它通过队列的先进先出来管理Message。
3 Handler: 它能把Message发给MessageQueue,并负责处理Looper分发给他的对应的Message。

Message是通过Handler对象发给MessageQueue的,而MessageQueue是由Looper负责创建的。
所以在线程中使用Handler分3步:
1 Looper.prepare()
2 重写Handler的handleMessage(Message msg)创建Handler子类对象
3 Looper.loop()

如何在新线程中创建Looper对象呢
private class CalThread extends Thread {
public Handler handler;

public void run() {
Looper.prepare();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// handler接收、处理Message
}
}
Looper.loop();
}
}

mCalThread = new CalThread().start();

Message msg = new Message();
msg.what = 0x123;
Bundle data = new Bundle();
data.putInt(EXTRA_DATA, 11111);
msg.setData(data);

// 主线程向子线程发送Message,在子线程中接收、处理Message (耗时操作在子线程中处理)
mCalThread.handler.sendMessage(msg);

// 子线程向主线程发送Message,在主线程中接收、处理Message(一般用来修改UI)

UI线程主要负责处理用户的按键事件、用户触屏事件及屏幕绘图事件。

新线程中更新UI的几种操作:
1 使用Handler实现线程之间的通信
2 Activity.runOnUiThread(Runable)
3 View.post(Runable)
4 View.postDelayed(Runable, long)

AsyncTask是为了简化2、3、4的操作,适用于简单的异步处理。
AsyncTask<Params, Progress, Result>
使用AsyncTask注意事项:
1 必须在UI线程中创建AsyncTask的实例
2 必须在UI线程中调用AysncTask的execute()
3 AsysncTask各种回调方法不能手动调用,只能由系统调用
4 每个AsyncTask只能执行一次。

Handler和IntentService的配合使用

android几种异步处理情况笔记

时间: 2024-10-24 06:42:48

android几种异步处理情况笔记的相关文章

[android] 两种异步方式

使用AsyncTask开启子线程获取服务器数据,更新界面UI /** * 异步任务 * * @author taoshihan * */ public class HttpAsyncTask extends AsyncTask<String, Void, String> { /** * 在执行后台任务之前执行 */ @Override protected void onPreExecute() { String netInfo = NetUtils.getNetworkInfo(context

《Android编程权威指南》-读书笔记(三)Git初探

<Android编程权威指南>-读书笔记(三)Git初探 版本控制-Git 为什么要使用版本控制 什么是版本控制?我为什么要关心它呢?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.在本书所展示的例子中,我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任何类型的文件进行版本控制. 如果你是位图形或网页设计师,可能会需要保存某一幅图片或页面布局文件的所有修订版本(这或许是你非常渴望拥有的功能).采用版本控制系统(VCS)是个明智的选择.有了它你就

Android五种布局说明

AbsoluteLayout---->是一个按照绝对坐标定义的布局,由于使用绝对坐标去定位控件,因此要实现自适应界面时,应尽少使用 AbsoluteLayout . RelativeLayout---->最好在界面设计时 做好布局,尽少程序运行时 做控件布局的更改,因为 RelativeLayout布局里面的属性之间,很容易冲突 FrameLayout---->顾名思义跟帧有关,布局里所有的控件都被放到布局的左上角,并且一层覆盖一层. TableLayout + TableRow----

Android开发之异步详解(二)之AsyncTask

请尊重他人的劳动成果,转载请注明出处:Android开发之异步详解(二)之AsyncTask http://blog.csdn.net/fengyuzhengfan/article/details/40212745 我曾在<Android开发之异步详解(一)之Thread+Handler>一文中介绍过通过Thread+Handler实现异步操作.感兴趣的朋友可以看一下. 虽然Thread+Handler可以实现更新主线程的UI并实现异步,但Thread+Handler模式需要为每一个任务创建一

Android:Handler实现异步处理功能

一.一个问题 有这样一个问题值得我们思考,若把一些类似于下载的功能(既耗时且不一定有结果)写在Activity(主线程)里,会导致Activity阻塞,长时间无响应,直至页面假死(如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭").因此,我们需要把这些耗时的操作放在单独的子线程中操作.这就是Handler的使命.Handler提供异步处理的功能,发送和接收不是同时的(Activity的主线程和线程队列里的线程是不同的线程,并行进行,互不影响). 二.Han

Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

Android中ListView异步加载图片错位.重复.闪烁问题分析及解决方案 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而ImageView控件就是View对象通

.Net中的几种异步模式

.Net中的几种异步模式 .Net中的几种异步模式基于事件的异步模式(EAP)IAsyncResult接口简单的异步模式--引入lambdaTask手动异步编程的问题 在C# 5.0引入async之前,存在几种异步编程模式,比如Event-based Asynchronous Pattern.IAsyncResult接口.Task等等. 基于事件的异步模式(EAP) private void DumpWebPage(Uri uri) { WebClient webClient = new Web

Android五种布局方式——LinearLayout、RelativeLayout、TableLayout....(四)

Android五种布局方式--LinearLayout.RelativeLayout .TableLayout.... Android使用XML声明界面布局 将程序的表现层和控制层分离 修改用户界面时,无需更改程序的源代码 可视化工具设计用户界面 Android五种布局方式 LinearLayout线性布局 AbsoluteLayout坐标布局 RelativeLayout相对布局 FrameLayout帧布局 TableLayout表格布局 GridLayout 1.LinearLayout线

Android开发之异步具体解释(一)Thread+Handler

请尊重他人的劳动成果,转载请注明出处:  Android开发之异步具体解释(一)Thread+Handler http://blog.csdn.net/fengyuzhengfan/article/details/40211589 在Android实际开发project中常常会进行一些诸如:文件读写.訪问网络等耗时的操作,这些耗时的操作是不建议放到UI线程里的. 所以我们会新开一个线程.在子线程中进行这些耗时的操作.耗时操作过程中.UI常常须要更新,但Android是不同意在子线程中改动UI的.