The flying fly is flying in the high and big sky...
// 定义一个handler,采用的是匿名类的方式,只处理query,因此只重写了onQueryComplete函数: queryHandler = new AsyncQueryHandler(this.getContentResolver()){ // 传入的是一个ContentResolver实例,所以必须在OnCreate后实例化该Handler类 @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { // 在这里你可以获得一个cursor和你传入的附加的token和cookie。 // 该方法在当前线程下(如果传入的是默认的Looper话),可以自由设定UI信息 } }; // 调用时只需要调用startQuery(int token, Object cookie, ContentURI uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)函数即可: queryHandler.startQuery(token, cookie, uri, projection, selection, selectionArgs, sortBy);
1. 当你实例化一个AsyncQueryHandler类时(包括其子类...),它会单件构造一个线程(后面会详述...),这个线程里面会构建一个消息循环。 2. 获得该消息循环的指针,用它做参数实例化另一个Handler类,该类为内部类。至此,就有了两个线程,各自有一个Handler来处理消息。 3. 当调用onXXX的时候,在XXX函数内部会将请求封装成一个内部的参数类,将其作为消息的参数,将此消息发送至另一个线程。 4. 在该线程的Handler中,接受该消息,并分析传入的参数,用初始化时传入的ContentResolver进行XXX操作,并返回Cursor或其他返回值。 5. 构造一个消息,将上述返回值以及其他相关内容绑定在该消息上,发送回主线程。 6. 主线程默认的AsyncQueryHandler类的handleMessage方法(可自定义,但由于都是内部类,基本没有意义...)会分析该消息,并转发给对应的onXXXComplete方法。 7. 用户重写的onXXXComplete方法开始工作。
posted on 2008-01-24 01:12 duguguiyu 阅读(581) 评论(4) 编辑 收藏 所属分类: Android
mark 回复 引用 查看
最后写的有点晕了。。。应该是这样:基于一个线程,会导致ContentProvider操作的拥塞。但在手机平台上,这种多源访问一个ContentProvider的机会不多(或者是时效性不强),并且可以避免一些同步问题。如果,你的情况有些不同,可以考虑自定义,采用更符合需求的线程管理方案(比如:池化...)。 回复 引用 查看
楼主真能侃哪。。。其实如果学java的都比较舒服使用这种方式,UI线程创建一个handler,再在里面开一个子线程,子线程去做content provider的费时操作,当完毕时,在子线程里面call handler.post() or sendMessage 去update把UI更新操作放到UI线程的queue里面。UI线程有空了就更新UI。。。挺简单一事。。。 回复 引用 查看
@larryzou第一次做java,不知道在java里通常都会怎么做,我走的是Android的API。。。 回复 引用 查看