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的异步处理的更多相关文章

  1. Android IntentService分析

    IntentService其实是一个很通用的知识点,最近看了下阿里巴巴Android开发手册,再次记录下 阿里巴巴Android开发手册 [强制]避免在 BroadcastReceiver#onRec ...

  2. Android线程管理之AsyncTask异步任务

    前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...

  3. Android IntentService完全解析 当Service遇到Handler

    一 概述 大家都清楚,在Android的开发中,凡是遇到耗时的操作尽可能的会交给Service去做,比如我们上传多张图,上传的过程用户可能将应用置于后台,然后干别的去了,我们的Activity就很可能 ...

  4. Android IntentService的使用和源码分析

    引言 Service服务是Android四大组件之一,在Android中有着举足重轻的作用.Service服务是工作的UI线程中,当你的应用需要下载一个文件或者播放音乐等长期处于后台工作而有没有UI界 ...

  5. IntentService 与ResultReceiver

    from://http://lyzhanghai.iteye.com/blog/947504 在google的I/O大会中关于“Writing zippy Android apps”,有讲过用Inte ...

  6. Android IntentService的使用和源代码分析

    引言 Service服务是Android四大组件之中的一个,在Android中有着举足重轻的作用.Service服务是工作的UI线程中,当你的应用须要下载一个文件或者播放音乐等长期处于后台工作而有没有 ...

  7. 【转载】Android IntentService使用全面介绍及源码解析

    一 IntentService介绍 IntentService定义的三个基本点:是什么?怎么用?如何work? 官方解释如下: //IntentService定义的三个基本点:是什么?怎么用?如何wo ...

  8. android官方开源的高性能异步加载网络图片的Gridview例子

    这个是我在安卓安卓巴士上看到的资料,放到这儿共享下.这个例子android官方提供的,其中讲解了如何异步加载网络图片,以及在gridview中高效率的显示图片此代码很好的解决了加载大量图片时,报OOM ...

  9. 实现在Android简单封装类似JQuery异步请求

    在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作 ...

随机推荐

  1. contOS 下安装mysql

    一.mysql简介 说到数据库,我们大多想到的是关系型数据库,比如mysql.oracle.sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库,咱 ...

  2. unittest框架,调用函数类 和 调用函数外的 方法

  3. 权益保护-知识产权:知识产权(IP)百科

    ylbtech-权益保护-知识产权:知识产权(IP)百科 知识产权,也称其为“知识所属权”,指“权利人对其智力劳动所创作的成果和经营活动中的标记.信誉所依法享有的专有权利”,一般只在有限时间内有效.各 ...

  4. phpmailer绑定邮箱

    1.配置 <?php return array ( 'email_host' => 'smtp.aliyun.com', 'email_port' => '25', 'email_u ...

  5. 多路复用IO

    多路复用IO(IO multiplexing) IO multiplexing这个词可能有点陌生,但是如果我说select/epoll,大概就都能明白了.有些地方也称这种IO方式为事件驱动IO (ev ...

  6. SqlServer——临时表

    1.表的类型: SqlServer数据库中分为两个表:永久表.临时表:通过表名的前缀区分. 永久表:与物理文件.C# 中的静态类 类似,任何用户均可对其执行操作并且相互影响: 临时表:简单的说就是使用 ...

  7. Java发送邮件Utils

    /** * 类文件说明 * */ public class SendMail { Logger log = Logger.getLogger(SendMail.class); /** * 发送邮件 * ...

  8. const&nbsp;int&nbsp;*pi与int&amp;nbs…

    此质料是摘要:<<彻底搞定C 指针 >>,自己感觉比较有价值,现与大家分享. 1. 从const int i 说起 你知道我们声明一个变量时象这样int i :这个i是可能在它 ...

  9. UIThread

    功能如下:点击Create则新创建一个窗口 一 . 资源中添加对话框,右键添加类MyDlg 双击初始对话框中的按钮,实现按钮功能:点击则创建一个对话框 CMyDialog* pDialog = new ...

  10. Spring总结八:jdbcTemplate的简单使用

    简介: Srping毕竟是一站式框架,所以也有操作数据库的东西,那就是jdbcTemplate,介绍一下jdbcTemplate的简单使用. 除了要引入必要的包以外,还需要引入 spring-jdbc ...