android_IntentService,AsyncTask,Handler




  //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();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值