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:

 1 public class QueryService extends IntentService {
 2 
 3     public QueryService() {
 4         super("service");
 5     }
 6 
 7     public final String action = "query";
 8     /**
 9      * 进行一些网络操作,如下载文件等
10      */
11     @Override
12     protected void onHandleIntent(Intent intent) {
13         System.out.println("进了service");
14         final ResultReceiver receiver = intent.getParcelableExtra("receiver");
15         String command = intent.getStringExtra("command");
16         Bundle bundle = new Bundle();
17         bundle.putString("data", "查询到的数据 ");
18         if (command.equals("query")) {
19             receiver.send(1, bundle);
20             try {
21                 // do something with data
22                 receiver.send(2, new Bundle());
23 
24             } catch (Exception e) {
25                 e.printStackTrace();
26                 receiver.send(3, new Bundle());
27 
28             }
29 
30         }
31         this.stopSelf();
32     }
33 }

MainActivity:

 1 public class MainActivity extends Activity {
 2 
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7         findViewById(R.id.button).setOnClickListener(new OnClickListener() {
 8 
 9             @Override
10             public void onClick(View v) {
11                 Intent intent = new Intent(MainActivity.this,
12                         QueryService.class);
13                 intent.putExtra("command", "query");
14                 intent.putExtra("receiver", new MyResultReceiver(new Handler()));
15                 MainActivity.this.startService(intent);
16             }
17         });
18     }
19 
20     // 对主界面进行一些修改
21     private class MyResultReceiver extends ResultReceiver {
22         private final int QUERY = 1, DELETE = 2, ERROR = 3;
23 
24         public MyResultReceiver(Handler handler) {
25             super(handler);
26         }
27 
28         @Override
29         protected void onReceiveResult(int resultCode, Bundle resultData) {
30             super.onReceiveResult(resultCode, resultData);
31 
32             switch (resultCode) {
33             case QUERY:
34                 System.out.println("query+query+query+query+query"
35                         + resultData.getString("data"));
36                 break;
37             case DELETE:
38 
39                 System.out.println("delete+delete+delete+delete+delete+delete");
40                 break;
41             case ERROR:
42                 System.out.println("error+error+error+error+error+error+");
43                 break;
44 
45             }
46 
47         }
48     }
49 
50 }

运行后的效果是:

从而可以知道顺序是:点击button -->> 启动QueryService  -->>根据传来的command执行相应功能-->> 执行完成以后发送广播给MainActivity告诉它执行后的结果-->>更新界面或则数据展示

代码下载:代码

原文地址:https://www.cnblogs.com/liangstudyhome/p/4137999.html