android IntentService和ResultReceiver的异步处理
IntentService和ResultReceiver的异步处理
1.在下载手机上从网络下载东西的时候会用到AsyncTask来方便处理,这里可以在用IntentService和ResultReceiver
对一些基本概念做一些了解:
IntentService:
IntentService是Service类的子类,用来处理异步请求。客户端可以通过startService(Intent)方法传递请求给IntentService,IntentService通过worker thread处理每个Intent对象,执行完所有的工作之后自动停止Service。
说明:worker thread处理所有通过传递过来的请求,创建一个worker queue,一次只传递一个intent到onHandleIntent中,从而不必担心多线程带来的问题。处理完毕之后自动调用stopSelf()方 法;默认实现了Onbind()方法,返回值为null;
它是Service、HandlerThread和Handler的强强联合。具有任务队列,顺序处理,
当处理完全部任务后
模式实现了StartCommand()方法,这个方法会放到worker queue中,然后在onHandleIntent()中执行0
使用IntentService需要两个步骤:
1、写构造函数
2、复写onHandleIntent()方法
好处:处理异步请求的时候可以减少写代码的工作量,比较轻松地实现项目的需求
ResultReceiver:
Generic interface for receiving a callback result from someone. Use this by creating a subclass and implement onReceiveResult(int, android.os.Bundle), which you can then pass to others and send through IPC, and receive results they supply with send(int, android.os.Bundle).
这是API上给的解释,说白了就是处理传过来的信息。和BroadCastReceiver一样的。
2.下面给一个例子:
1).调用startService。
2).service中开始操作处理,并且通过消息告诉activity处理已经开始。
3).activity处理消息并且显示进度条(进度条就不显示了,就打印出一段话即可)
4).service完成处理并且返回给activity需要的数据。
5).activity处理数据。
6).service通过消息告诉activity处理完成,并且kill掉自己。
7).activity取得消息并且结束掉进度条。
代码如下:
QueryService:
public class QueryService extends IntentService { public QueryService() {
super("service");
} public final String action = "query";
/**
* 进行一些网络操作,如下载文件等
*/
@Override
protected void onHandleIntent(Intent intent) {
System.out.println("进了service");
final ResultReceiver receiver = intent.getParcelableExtra("receiver");
String command = intent.getStringExtra("command");
Bundle bundle = new Bundle();
bundle.putString("data", "查询到的数据 ");
if (command.equals("query")) {
receiver.send(1, bundle);
try {
// do something with data
receiver.send(2, new Bundle()); } catch (Exception e) {
e.printStackTrace();
receiver.send(3, new Bundle()); } }
this.stopSelf();
}
}
MainActivity:
public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
QueryService.class);
intent.putExtra("command", "query");
intent.putExtra("receiver", new MyResultReceiver(new Handler()));
MainActivity.this.startService(intent);
}
});
} // 对主界面进行一些修改
private class MyResultReceiver extends ResultReceiver {
private final int QUERY = 1, DELETE = 2, ERROR = 3; public MyResultReceiver(Handler handler) {
super(handler);
} @Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
super.onReceiveResult(resultCode, resultData); switch (resultCode) {
case QUERY:
System.out.println("query+query+query+query+query"
+ resultData.getString("data"));
break;
case DELETE: System.out.println("delete+delete+delete+delete+delete+delete");
break;
case ERROR:
System.out.println("error+error+error+error+error+error+");
break; } }
} }
运行后的效果是:
aaarticlea/png;base64,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" alt="" />
从而可以知道顺序是:点击button -->> 启动QueryService -->>根据传来的command执行相应功能-->> 执行完成以后发送广播给MainActivity告诉它执行后的结果-->>更新界面或则数据展示
代码下载:代码
android IntentService和ResultReceiver的异步处理的更多相关文章
- Android IntentService分析
IntentService其实是一个很通用的知识点,最近看了下阿里巴巴Android开发手册,再次记录下 阿里巴巴Android开发手册 [强制]避免在 BroadcastReceiver#onRec ...
- Android线程管理之AsyncTask异步任务
前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...
- Android IntentService完全解析 当Service遇到Handler
一 概述 大家都清楚,在Android的开发中,凡是遇到耗时的操作尽可能的会交给Service去做,比如我们上传多张图,上传的过程用户可能将应用置于后台,然后干别的去了,我们的Activity就很可能 ...
- Android IntentService的使用和源码分析
引言 Service服务是Android四大组件之一,在Android中有着举足重轻的作用.Service服务是工作的UI线程中,当你的应用需要下载一个文件或者播放音乐等长期处于后台工作而有没有UI界 ...
- IntentService 与ResultReceiver
from://http://lyzhanghai.iteye.com/blog/947504 在google的I/O大会中关于“Writing zippy Android apps”,有讲过用Inte ...
- Android IntentService的使用和源代码分析
引言 Service服务是Android四大组件之中的一个,在Android中有着举足重轻的作用.Service服务是工作的UI线程中,当你的应用须要下载一个文件或者播放音乐等长期处于后台工作而有没有 ...
- 【转载】Android IntentService使用全面介绍及源码解析
一 IntentService介绍 IntentService定义的三个基本点:是什么?怎么用?如何work? 官方解释如下: //IntentService定义的三个基本点:是什么?怎么用?如何wo ...
- android官方开源的高性能异步加载网络图片的Gridview例子
这个是我在安卓安卓巴士上看到的资料,放到这儿共享下.这个例子android官方提供的,其中讲解了如何异步加载网络图片,以及在gridview中高效率的显示图片此代码很好的解决了加载大量图片时,报OOM ...
- 实现在Android简单封装类似JQuery异步请求
在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作 ...
随机推荐
- 1120 Friend Numbers
题意:略. 思路:水题,略. 代码: #include <iostream> #include <string> using namespace std; ; }; int m ...
- python学习(十七) 扩展python
c, c++, java比python快几个数量级. 17.1 考虑哪个更重要 开发速度还是运行速度更重要. 17.2 非常简单的途径:Jython和IronPython Jython可以直接访问JA ...
- jQuery笔记——基础知识
jQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一整套定义好的方法.在jQuery程序中,不管是页面元素的选择.内置的功能函数,都是美元符号“$”来起 始的.而这 ...
- 进程之 Process join方法其他属性与进程Queue
Process join方法 以及其他属性 在主进程运行过程中如果想并发地执行其他的任务,我们可以开启子进程,此时主进程的任务与子进程的任务分两种情况 情况一:在主进程的任务与子进程的任务彼此独立的情 ...
- 完整部署OpenStack-memcache配置
一.[root@openstack-server ~]# nova listERROR (CommandError): You must provide a username or user id v ...
- hbase集群配置
说明 安装 配置 启动 网页效果 一点废话 本文介绍hbase集群配置 说明 hbase想正确配置成功的前提是,你必须知道hadoop集群和zookeeper集群是如何配置的 安装 下载地址 http ...
- AJAX如何获取从前台传递过来的数据然后在通过servle传递给后台
1 用 request.getParameter接收值 <% String id1=request.getParameter("id"); out.print(id1); % ...
- div+css 左右两列自适应高度 ,以及父级div也跟着自适应子级的高度(兼容各大浏览器)
<style type="text/css" media="screen"> <!-- #main {width:500px;_height: ...
- 02-20 winform 上传图片并读取图片
建立一个windows窗体应用程序,在form1界面中拖入两个按钮和一个pictureBox,通过输入输出流来上传图片和显示图片.需要添加一下openFileDialog1. 界面如下: 在cs中写上 ...
- request.getHeader("x-forwarded-for")这是什么意思
request.getHeader,简单的说就是获取请求的头部信息,根据http协议,它能获取到用户访问链接的信息,以下是我们常用的: request.getHeader("referer& ...