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_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中.

内部原理如下:

来自为知笔记(Wiz)

时间: 2024-07-28 19:36:29

Handler研究2-AsyncTask,AsyncQueryHandler分析的相关文章

SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-convert.html 目录 前言 现象 源码分析 实例讲解 关于配置 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-in

ListView动态加载数据分页(使用Handler+线程和AsyncTask两种方法)

ListView动态加载数据分页(使用Handler+线程和AsyncTask两种方法)

android之AsyncTask原理分析

通过名字就可以知道,AsyncTask主要用于处理android中的异步任务.但是通过源码,我们可以看到它的实现其实还是依赖于Handler的异步消息处理机制.现在我们先来学习它的使用方式,然后再研究源码. 一.AsyncTask的基本用法: AsyncTask是一个抽象类,在之类继承它时,必须指定三个泛型参数,这三个参数的用途如下: 1. 在执行AsyncTask时需要传入的参数,可用于在后台任务中使用. 2. 后台任何执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位.

Android 开发笔记 “线程交互(Handler+Thread 和 AsyncTask)”

为什么需要线程 假设需要开发一个联网应用程序,需要从一个网址抓取网页内容,这里读取的网页地址是笔者在本地机器上自己建立的服务器地址.当然在读取网页内容的时候,可以使用HttpClient提供的API,但是这并不是本文的介绍重点.缺乏联网程序开发经验的程序员可能写出下面的代码. package com.ophone.network; //这里为了节省篇幅,忽略了import项 public class NetworkActivity extends Activity { // 显示任务的执行状态和

SpringMVC关于json、xml自动转换的原理研究[附带源码分析]

本文讨论SpringMVC关于json.xml自动转换的原理. 实现这个功能只需要三个配置 1.springmvc配置文件 dispatcher-servlet.xml中的关键配置如下 <mvc:resources location="/static/" mapping="/static/**"/> <!-- 配置包扫描器 --> <context:component-scan base-package="com.winner

【Android】Handler、Looper源码分析

一.前言 源码分析使用的版本是 4.4.2_r1. Handler和Looper的入门知识以及讲解可以参考我的另外一篇博客:Android Handler机制 简单而言:Handler和Looper是对某一个线程实现消息机制的重要组成部分,另外两个重要元素是Message和MessageQueue,通过这四个类,可以让某个线程具备接收.处理消息的能力. 二.源码剖析 虽然只有四个类,而且这里只是剖析其中两个,但是也不能独立分析,必须组合进行解析.切入点是类Looper的注释中的一段示例代码: 1

android异步请求asyncTask使用—分析getResponseCode()阻塞

在实际应用中经常会遇到比较耗时任务的处理,比如网络连接,数据库操作等情况时,如果这些操作都是放在主线程(UI线程)中,则会造成UI的假死现象,Android中可以使用AsyncTask和Handler两种异步方式来解决这种问题. AsyncTask(异步任务处理) 在使用AsyncTask时处理类需要继承AsyncTask,提供三个泛型参数,并且重载AsyncTask的四个方法(至少重载一个). An asynchronous task is defined by a computation t

Handler消息机制源码分析

public static final Looper myLooper() { return (Looper)sThreadLocal.get(); } 先来个Handler执行过程的总结: 1. Looper.prepare()方法 为当前线程绑定looper, 在looper构造方法中创建一个messageQueue 2. 创建handler 重并写handleMessage方法 3. 使用handler发送消息,最终消息都会发送至messageQueue对象中,在messageQueue当

第32件事 用户研究之社会流动性分析

最近总是在微信朋友圈看到一些权威机构发布关于70.80甚至90后行为.态度.价值观的调研报告.他很是不解,花费这么多的精力整理出来的报告到底价值几何?对产品经理做产品有帮助吗?这是一个很严肃的哲学问题.产品经理做产品久了,很容易局限于自己所处的微观环境和场景之中,却很少知道宏观环境及其动态变化对产品带来的极大影响.因为没有用动态变化的观点来剖析用户的行为和心理特征,做出来的产品很有可能与时代脱节,甚至被时代抛弃.用户与需求就像是一枚硬币的正反面,永远紧密相连,这次涉及的问题其实是一种用户研究的分