对于Android的IPC来说,除了Handler和Looper之外,还有另外一种简便的方法来实现多线程的通信,那就是AsyncTask。AsyncTask是一个异步的方法,它允许背景运算并把结果更新到前台的UI线程之上。要实现一个AsyncTask主要有4个步骤,但并不是每一个步骤都是必需的。
这四个步骤是:
onPreExecute() 执行背景运算前任务的初始化;
doInBackground(Params...)这是AsyncTask最核心的函数,即是做背景运算;它在第一步完成之后被调用,通常在这步中还会调用方法publishProgress(Progress...)将运算结果更新到UI主线程上;
onProgressUpdate(Progress...)是在publishProgress(Progress...)调用之后被执行的,需要注意到是这步执行的时间是未定的,通常在这一步中会更新相关UI;
onPostExecute(Result)这一步同样是和UI相关,将运算结果Result当作参数传递给UI。
大家可能已经注意到AsyncTask除了四大步之外,还有三个重要的参数:AsyncTask<Params, Progress, Result>。三个参数为通用类型,Params是传给任务初始化的参数,Progress是做背景运算过程中和UI交互的参数,Result是背景运算传递给UI的结果。
利用好这四大步和三个参数,我们可以方便的写出上节例子中的Demo:
- package waterlife.ipc.demo;
-
- import java.io.InputStream;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.net.URLConnection;
-
- import android.app.Activity;
- import android.os.AsyncTask;
- import android.os.Bundle;
- import android.widget.ProgressBar;
-
- public class myAsyncTask extends Activity {
- static ProgressBar pb;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- pb = (ProgressBar)findViewById(R.id.ProgressBar01);
- Download dl = new Download();
- dl.execute();
- }
-
- public class Download extends AsyncTask<Void, Integer, Void>
- {
-
- @Override
- protected Void doInBackground(Void... params) {
-
- int totalSize = 0;
- InputStream recevier = null;
- try {
- URL myUrl = new URL("http://bbs.nju.edu.cn/");
-
- URLConnection urlConn = myUrl.openConnection();
- totalSize = urlConn.getContentLength();
- recevier = urlConn.getInputStream();
- byte[] b =new byte[256];
- int length = 0;
- length += recevier.read(b);
- while(length < totalSize)
- {
- length += recevier.read(b);
- publishProgress((int)(length*100/totalSize));
- }
- recevier.close();
- } catch (MalformedURLException e) {
-
- e.printStackTrace();
- }catch (Exception ex)
- {
- ex.printStackTrace();
- }
- return null;
- }
-
- protected void onProgressUpdate(Integer... progress) {
- pb.setProgress(progress[0]);
- }
- }
- }
在这个Demo中只有第二和第三步,只有第二个参数params,是一个整型参量,把下载数据包的进度更新给UI Progressbar显示。
另外,使用AsyncTask需要注意以下几点:
1. AsyncTask的实例只能在UI线程中创建;
2. dl.execute()方法只能在UI线程中调用,并且只能调用一次,否则会抛异常。
分享到:
相关推荐
Deep Dive into Android IPC-Binder Framework 深入Android IPB/Binder 框架
Android Bluetooth Framework 应用层分析 AndroidBluetooth Framework 是 Android 操作系统中的蓝牙协议栈,负责管理蓝牙设备的连接、数据传输和蓝牙 Profile 的管理。整个蓝牙系统可以分为四个层次:蓝牙嵌入式...
4.1 如何加入 API 至 Android Framework 4.2 如何编译并制作独立 JAR 档 4.3 上机实验:开发LedService API 与制作mokoid.jar 程式库 5.JNI & Runtime Library 5.1 什么是 JNI 5.2 如何撰写 JNI & Native Method ...
IPC/Binder Framework at Android Builders Summit 2013 Binder Overview IPC Advantages of Binder Binder vs Intent/ContentProvider/Messenger-based IPC Binder Terminology Binder Communication and ...
A smart, novel and easy-to-use framework for Android Inter-Process Communication (IPC). Chinese Readme 中文文档 Hermes is a smart, novel and easy-to-use framework for Android Inter-Process ...
android技术内幕--系统卷,第三章Android的IPC机制,关于Binder通信机制,详细讲解,并附有framework层代码说明,
Android 简介 Android开发环境 Android 开发基础 Android Application 开发细节 Android Framework Android 线程通信/ IPC 通信 Andorid 整合开发
Android内训教程,包括Android 简介 Android开发环境 Android 开发基础 Android Application 开发细节 Android Framework Android 线程通信/ IPC 通信 Andorid 整合开发
Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的。所以搞明白Binder的话,在很大程度上就能理解程序运行的流程。我们这里将以MediaService的例子来...
Android中的Binder通信是基于Service与Client的,所有需要IBinder通信的进程都必须创建一个IBinder接口,系统中 有一个进程管理所有的system service,Android不允许用户添加非授权的System service,当然现在源码开发...
Deep Dive into Android IPC:Binder Framework android与linux的关系 (看前几页PPT就好了) Android的匿名共享内存机制是在内核实现的,也是基于Linux内核本身的共享内存机制,作了一层封装。Android提供了匿名共享...
19.3.1 Android IPC通信补充 19.3.2 Android USB Mass Storage流程分析 第20章Bootloader引导子系统 20.1 Bootloader流程分析 20.1.1 Bootloader概述 20.1.2 U-Boot启动流程分析 20.2 Bootloader修改指南 20.2.1开机...
This doc tells you that how the IBinder IPC at Google Android framework works, using 1 ezxample code....
高焕堂之五本android中文书: AndroidBook_001_GraphicThinking_V2.0 AndroidBook_002_EIT_Framework_V2.0 AndroidBook_003_ThreadModel_V2.0 AndroidBook_004_IPC_Binder_V2.0 AndroidBook005_JNI_Skills_V1.0
它继承了IBinder接口 从IPC角度来说,Binder是Android中的一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux中没有 从Android Framework角度来说,...
Android 核心分析 之二 ------- 方法论探讨之概念空间篇 .............................................. 3 Android 是什么 之三 ------- 手机之硬件形态 ..........................................................
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
值得从事android hal层开发的人一看。 从这个图来看Sensor的架构还是非常的清淅, 黄色部分表示硬件,它要挂在I2C总线上 红色部分表示驱动,把驱动注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor...
d) Android应⽤框架(ANDROIDFRAMEWORK) 应⽤程序框架是指定义了⼀个应⽤程序运⾏所必须的全部功能组件,开发者也可以访问核⼼应⽤程序所使⽤的API框架。在Android系统中, 开发⼈员也可以完全访问核⼼应⽤程序所使⽤...
Introducing the Development Framework 11 What Comes in the Box 12 Understanding the Android Software Stack 12 The Dalvik Virtual Machine 14 Android Application Architecture 14 Android Libraries ...