标签:
AsyncTask
可以自己写一个 AsyncTask, 唉.
实际开发中, 如果用 AsyncTask 访问网络, 可以重写一个AsyncTask, 加上判断网络状态的功能
protected abstract class MyHttpTask<Params> extends AsyncTask<Params, Void, Message> {
// 当前BaseView类中无法获知需要进行什么操作
// protected Message doInBackground(Params... params) {
// // TODO Auto-generated method stub
// return null;
// }
// 效仿Thread----start方法改造:具有判断网络的功能
// @Override 无法Override AsyncTask 的 execute方法
public final AsyncTask<Params, Void, Message> executeProxy(Params... params) {
if (NetUtil.checkNetType(context)) {
return execute(params);
} else {
PromptManager.showNoNetWork(context);
}
return null;
}
}
}使用如下:
new MyHttpTask<Integer>() {
protected void onPreExecute() {
PromptManager.showProgressDialog(context);
}
@Override
protected Message doInBackground(Integer... params) {
CommonInfoEngine engine = BeanFactory.getImpl(CommonInfoEngine.class);
return engine.getCurrentIssueInfo(params[0]);
}
protected void onPostExecute(Message result) {
PromptManager.closeProgressDialog();
// 判断返回信息
if (result != null) {
Oelement oelement = result.getBody().getOelement();
if ("0".equals(oelement.getErrorCode())) {
// 更新界面
CurrentIssueElement element = (CurrentIssueElement)
result.getBody().getElements().get(0);
// 存储信息到bundle
bundle = new Bundle();
bundle.putString("issue", element.getIssue());
//更新标题
setTitle();
} else {
PromptManager.showToast(context, oelement.getErrorMsg());
}
} else {
// 提示用户
PromptManager.showToast(context, "服务器忙请稍后重试……");
}
}
}.executeProxy(ConstantValue.SSQ);
AsyncQueryHandler
查询数据库可能是比较耗时的操作, 需要把它放在新线程里.
android提供了一个专门用于简化在新线程中查询数据库的类: AsyncQueryHandler
用法如下:
//得到cursor
private void prepareData() {
SmsAsyncHandler handler = new SmsAsyncHandler(getContentResolver());
// This method begins an asynchronous query.
// When the query is done onQueryComplete is called.
handler.startQuery(0, null, SmsUriUtil.CONVERSATION_URI, CONVERSATION_PROJECTION,
null, null, "date desc");
}
//专门为查询数据库使用的异步线程类
private class SmsAsyncHandler extends AsyncQueryHandler { public SmsAsyncHandler(ContentResolver cr) {
super(cr);
}
// 根据上面的注释, 当startQuery完成时, 会调用这个方法
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
// 这个时候, adapter可能已经创建了, 所以这个时候在给 cursor赋值就迟了
// ConversationActivity.this.c = cursor;
// 要使用下面的方法改变adapter的cursor
adapter.changeCursor(cursor);
}
}
注意最后一定要调用 adapter.changeCursor(cursor), 这样才能把cursor查出来的东西显示到ListView中.
内部原理如下:
Handler研究2-AsyncTask,AsyncQueryHandler分析
标签:
原文地址:http://www.cnblogs.com/ywq-come/p/5926635.html