您的位置:首页 > 移动开发 > Android开发

android_IntentService,AsyncTask,Handler

2013-08-30 17:20 295 查看
//Service不是一个独立的进程(除非特别指定),它与应用程序在同一进程中。Service不是一个线程,应该避免耗时操作。

//IntentService以队列方式将请求的Intent加入队列,开启工作者执行任务,不会堵塞UI线程。 ----- (AsynTask)

//IntentService是Serivce+handler的结合产物(只有一个线程执行任务),AsyncTask是thread+handler的结合产物(多个线程执行任务,线程池)。

//AsyncQueryService是后台执行ContentResolver调用的服务,减少因activity关闭而导致的调用的失败。AsyncQueryHandler在子线程中调用ContentResolver,支持增删改查,同样支持延时/取消执行。

class AsyncQueryService extends Handler {

public void startQuery() {

AsyncQueryServiceHelper.queueOperation(mContext, info);

}

}

public class AsyncQueryServiceHelper extends IntentService {

static public void queueOperation(Context context, OperationInfo args) {

// Set the schedule time for execution based on the desired delay.

args.calculateScheduledTime();

synchronized (sWorkQueue) {

sWorkQueue.add(args);

sWorkQueue.notify();

}

context.startService(new Intent(context, AsyncQueryServiceHelper.class));

}

}

abstract class IntentService extends Service { **** }

OperationInfo implements Delayed { **** }

interface Delayed extends Comparable<Delayed> { **** }

Handler两个主要用途(官网):定时发送消息/执行任务(post--Runnable);让不同的线程执行动作(sendMessage--Message)。

Handler主要接收子线程发送的数据,并用此数据配合主线程更新UI。处理消息按照先进先出方式。

Handler和多线程:post发送一个实现了Runnable接口的类对象,但是它并非创建了一个新线程,而是执行该对象的run方法。也就是说,整个run中的操作和主线程处于同一个线程。

为了避免假死,handler绑定到一个新开启线程的消息队列上,在这个处于另外线程的上的消息队列中处理传过来的Runnable对象和消息。这里用到的多线程并非由Runnable对象开启的,而是ThreadHandler对象开启的。Runnable对象只是作为一个封装操作的对象被传递,并未产生新线程。

public class HandlerThread extends Thread { **** } //加入了Looper。即 消息队列+消息循环。

public class Thread implements Runnable { **** } //实现run方法;启动调用start方法。

HandlerThread使用方法(不当做一次性消耗品):mHandlerThread.start(); mWorkerHandler=new WorkerHandler(mHandlerThread.getLooper()); mWorkerHandler.post(runnable);

Activity中runOnUiThread方法:

public final void runOnUiThread(Runnable action) {

if (Thread.currentThread() != mUiThread) {

mHandler.post(action);

} else {

action.run();

}

}

//Message中包含了 Runnable/Handler变量等。

public final class Message implements Parcelable {

public int what;

public Object obj;

Runnable callback;

Handler target;

}

//Handler调用post方法,会封装为Message;sendMessage时,插入到MessageQueue队列,Message的hanlder变量被赋值。

public class Handler {

public boolean sendMessageAtTime( ** ){

MessageQueue queue = mQueue;

msg.target = this;

sent = queue.enqueueMessage(msg, uptimeMillis);

return sent;

}

private final Message getPostMessage(Runnable r) {

Message m = Message.obtain();

m.callback = r;

return m;

}

}

//Looper中有ThreadLocal变量。

public class Looper {

private static final ThreadLocal sThreadLocal = new ThreadLocal();

final MessageQueue mQueue;

Thread mThread;

public static final void loop() {

Looper me = myLooper();

MessageQueue queue = me.mQueue;

while (true) {

Message msg = queue.next(); // might block

msg.target.dispatchMessage(msg);

msg.recycle();

}

}

退出Looper线程:mHandlerThread.getLooper().quit();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: