用IntentService 与ResultReceiver连接web service

IntentService 与ResultReceiver的搭配可以很方便地处理简单的异步问题,用这种方法可以避免启动一大堆错综复杂且难以管理的线程。

 

举个例子,你想从web service取一些数据:
1. 调用startService。
2. service中开始操作处理,并且通过消息告诉activity处理已经开始。
3. activity处理消息并且显示进度条
4. service完成处理并且返回给activity需要的数据。
5. activity处理数据。
6. service通过消息告诉activity处理完成,并且kill掉自己。
7. activity取得消息并且结束掉进度条。


一、先介绍一下IntentService

IntentService继承自Service,从源码上看,它是Service、HandlerThread和Handler的强强联合。具有任务队列,顺序处理,

当处理完全部任务后,它会自动kill掉自己,完全不用我们操心。大家有兴趣可以去查一下资料。

二、ResultReceiver

这个是用来接收返回信息的类,来自 android.os.ResultReceiver。


三、使用方法:

public class HomeActivity extends Activity implements ResultReceiver {
public void onCreate(Bundle savedInstanceState) {
...
final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, QueryService.class);
intent.putExtra("receiver", this);
intent.putExtra("command", "query");
startService(intent);
}

public void onReceiveResult(int resultCode, Bundle resultData) {
switch (resultCode) {
case RUNNING:
//show progress
break;
case FINISHED:
List results = resultData.getParcelableList("results");
// do something interesting
// hide progress
break;
case ERROR:
// handle the error;
break;
}
}
service代码:
public class QueryService extends IntentService {
protected void onHandleIntent(Intent intent) {
final ResultReceiver receiver = intent.getParcelableExtra("receiver");
String command = intent.getStringExtra("command");
Bundle b = new Bundle();
if(command.equals("query") {
receiver.send(STATUS_RUNNING, Bundle.EMPTY);
try {
// get some data or something
b.putParcelableArrayList("results", results);
receiver.send(STATUS_FINISHED, b)
} catch(Exception e) {
b.putString(Intent.EXTRA_TEXT, e.toString());
receiver.send(STATUS_ERROR, b);
}
}
this.stopSelf();
}
}


参考文章:http://biancheng.dnbcw.info/shouji/326279.html


posted @ 2012-02-13 12:24  獨樂  阅读(1635)  评论(0编辑  收藏  举报