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告诉它执行后的结果-->>更新界面或则数据展示
代码下载:代码