首页 > 代码库 > android IntentService和ResultReceiver的异步处理
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 @Override12 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 data22 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 @Override10 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 @Override29 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告诉它执行后的结果-->>更新界面或则数据展示
代码下载:代码
android IntentService和ResultReceiver的异步处理