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. C# 判断程序是否已在运行

    方法一: Process[] processes = rocess.GetProcessesByName("ConDemo"); ) { MessageBox.Show(" ...

  2. 安装S_S相关报错的troubleshooting

    在安装S_S server时,在Debian上会出现类似如下的报错: File , in <module> sys.exit(main()) File , in main config = ...

  3. The java.util.concurrent Synchronizer Framework笔记

    这篇笔记是关于 Doug Lea 的 The java.util.concurrent Synchronizer Framework . 原文地址:http://gee.cs.oswego.edu/d ...

  4. atorg.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:557)

    错误原因: 你当前开发环境中{Hadoop_HOME}\bin\hadoop.dll 文件和你当前的hadoop版本不匹配.  解决方案: 网络下载相应版本的hadoop.dll,并将该文件放入c:\ ...

  5. python开发函数进阶:生成器表达式&各种推导式

    一,生成器表达式 #生成器表达式比列表解析更省内存,因为惰性运算 #!/usr/bin/env python #_*_coding:utf-8_*_ new_2 = (i*i for i in ran ...

  6. 屏蔽sql server 2008的智能提示

    1. 去掉这个勾 2. 如果你安装了Sql complete, 接着下面的

  7. 1.3Broker

    Celery需要一种解决消息的发送和接受的方式,我们把这种用来存储消息的的中间装置叫做message broker, 也可叫做消息中间人. 作为中间人,我们有几种方案可选择: 1.RabbitMQ R ...

  8. 利用HADOOP中的jar写一个RPC

    RPC调用需要服务端和客户端使用相同的协议: 协议: package cn.itcast.bigdata.hadooprpc.protocol; public interface IUserLogin ...

  9. OO设计基本原则

    OO本身就是一种大的设计模式,它是随着软件规模越来越大产生出来帮助人们建模和开发的理念,生来就带着封装.继承.多态等可复用基因.为了充分发挥这些基因的功效,使用者需要遵守一定的原则,就是所谓的面向对象 ...

  10. ffmpeg设置avformat_open_input( )超时 -stimeout

    ffmpeg用avformat_open_input()解析网络流时,默认是阻塞的. 当遇到解析错误的网络流时,会导致该函数长时间不返回. 为此可以设置ffmpeg的-stimeout 的参数,要注意 ...