首页 > 代码库 > Handler研究2-AsyncTask,AsyncQueryHandler分析

Handler研究2-AsyncTask,AsyncQueryHandler分析

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_URICONVERSATION_PROJECTION,
                nullnull"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中.
内部原理如下:
技术分享
 



























来自为知笔记(Wiz)


Handler研究2-AsyncTask,AsyncQueryHandler分析