Handler消息机制与AsyncTask深度解析-从源码带你看handler
2016-06-16 23:16
741 查看
handler在我们Android开发过程中是最长用到的处理消息及其他事务的,其消息机制相信也被大家所熟知 .接下来深入带大家看一下handler的消息机制和AsyncTask的解析
Message
Hanldre
Messagqueue
Looper
!= null) { Message m = mPool; mPool = m.next; m.next = null; return m; } } return new Message(); }
per thread"); } sThreadLocal.set(new Looper());//实例化Looper }
谁调用prepareMainLooper方法();当Activity被创建的时候,创建一个对应的线程ActivityThread.java
2.模仿AsyncTask的原理,自定义类似于AsyncTask工具类
3.查看AsyncTask源码execute 和构造方法
private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(COREPOOLSIZE,
MAXIMUM_POOLSIZE,
KEEPALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);
Handler消息机制
Hanlder有四大核心类Message
Hanldre
Messagqueue
Looper
Message的实例
Message msg = new Message(); Message.obtain();//取队列的下一个消息 public static Message obtain() { synchronized (mPoolSync) { if (mPool!= null) { Message m = mPool; mPool = m.next; m.next = null; return m; } } return new Message(); }
Hanldre的实例
实例化Hanlder public Handler() { .... //得到一个Looper的实例 mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); } //得到消息队列 mQueue = mLooper.mQueue; mCallback = null; } public static final Looper myLooper() { return (Looper)sThreadLocal.get(); } public static final void prepare() { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper());//实例化Looper }
Messagqueue的实例,当Looper被创建的时候,同时也创建一个对应的消息队列
private Looper() { mQueue = new MessageQueue(); mRun = true; mThread = Thread.currentThread(); }
Looper的实例,当prepare方法被调用的时候,Looper被实例化
public static final void prepare() { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be createdper thread"); } sThreadLocal.set(new Looper());//实例化Looper }
public static final void prepareMainLooper() { prepare();//调用了prepare方法,其实就是实例化Looper setMainLooper(myLooper()); if (Process.supportsProcesses()) { myLooper().mQueue.mQuitAllowed = false; } }
谁调用prepareMainLooper方法();当Activity被创建的时候,创建一个对应的线程ActivityThread.java
public static final void main(String[] args) { SamplingProfilerIntegration.start(); Process.setArgV0("<pre-initialized>"); //调用prepareMainLooper Looper.prepareMainLooper(); if (sMainThreadHandler == null) { sMainThreadHandler = new Handler(); } ActivityThread thread = new ActivityThread(); thread.attach(false); if (false) { Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread")); } Looper.loop();//轮询器开始工作 }
Looper.loop()方法的工作原理,代码如下:?
public static final void loop() { Looper me = myLooper(); MessageQueue queue = me.mQueue; while (true) { Message msg = queue.next(); // might block //if (!me.mRun) { // break; //} if (msg != null) { if (msg.target == null) { // No target is a magic identifier for the quit message. return; } if (me.mLogging!= null) me.mLogging.println( ">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what ); msg.target.dispatchMessage(msg); if (me.mLogging!= null) me.mLogging.println( "<<<<< Finished to " + msg.target + " " + msg.callback); msg.recycle(); } } }
AsyncTask原理
1.伪代码new AsyncTask<String ,String ,String>(){ //2.在主线程执行,做一条准备操作; public void onPreExecute(){ } //3.运行在子线程中,做一些耗时的操作,比如联网请求数据。 public String doInBackground(String ...params){ return null; } //4.result就是doInBackground方法返回的值,做一些释放资源的操作。 public void onPostExecute(String result){ } }.execute(String ...params);//1.在主线程中执行这个方法,要开始执行异步任务了;
2.模仿AsyncTask的原理,自定义类似于AsyncTask工具类
3.查看AsyncTask源码execute 和构造方法
在AsyncTask中onPreExecute方法代码的实现
protected void onPreExecute() { } protected abstract Result doInBackground(Params... params); protected void onPostExecute(Result result) { }
查看AsyncTask的构造方法
public AsyncTask() { //WorkerRunnable继承或者实现什么 实现Callable接口 mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); return doInBackground(mParams); } }; //FutureTask继承或者实现什么 实现RunnableFuture接口 ; //RunnableFuture继承两个接口 Runnable, Future mFuture = new FutureTask<Result>(mWorker) { @Override protected void done() { Message message; Result result = null; try { result = get(); } catch (InterruptedException e) { android.util.Log.w(LOG_TAG, e); } catch (ExecutionException e) { throw new RuntimeException("An error occured while executing doInBackground()", e.getCause()); } catch (CancellationException e) { message = sHandler.obtainMessage(MESSAGE_POST_CANCEL, new AsyncTaskResult<Result>(AsyncTask.this, (Result[]) null)); message.sendToTarget(); return; } catch (Throwable t) { throw new RuntimeException("An error occured while executing " + "doInBackground()", t); } message = sHandler.obtainMessage(MESSAGE_POST_RESULT, new AsyncTaskResult<Result>(AsyncTask.this, result)); message.sendToTarget(); } }; } //callable 是WorkerRunnable public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); sync = new Sync(callable); } //callable 是WorkerRunnable Sync(Callable<V> callable) { this.callable = callable; }
execute()方法的执行,重点,在主线程中执行
public final AsyncTask<Params, Progress, Result> execute(Params... params) { .... onPreExecute();//主线程 mWorker.mParams = params; sExecutor是什么 线程池ThreadPoolExecutor sExecutor.execute(mFuture);mFuture是FutureTask//当这个代码执行的时候会执行 FutureTask的run return this; }
private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(COREPOOLSIZE,
MAXIMUM_POOLSIZE,
KEEPALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);
FutureTask的run方法代码如下
//1.调用innerRun public void run() { sync.innerRun(); } void innerRun() { if (!compareAndSetState(READY, RUNNING)) return; runner = Thread.currentThread(); if (getState() == RUNNING) { // recheck after setting thread V result; try { //2.调用了call方法;callable是WorkerRunnable result = callable.call(); } catch (Throwable ex) { setException(ex); return; } //4.设置值 set(result); } else { releaseShared(0); // cancel } } mWorker = new WorkerRunnable<Params, Result>() { //3.调用call public Result call() throws Exception { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); return doInBackground(mParams);//在子线程 } }; protected void set(V v) { //5. sync.innerSet(v); } void innerSet(V v) { for (;;) { int s = getState(); if (s == RAN) return; if (s == CANCELLED) { // aggressively release to set runner to null, // in case we are racing with a cancel request // that will try to interrupt runner releaseShared(0); return; } if (compareAndSetState(s, RAN)) { result = v; releaseShared(0); //6. done(); return; } } } mFuture = new FutureTask<Result>(mWorker) { @Override protected void done() { Message message; Result result = null; try { //7. result = get(); } catch (InterruptedException e) { android.util.Log.w(LOG_TAG, e); } catch (ExecutionException e) { throw new RuntimeException("An error occured while executing doInBackground()", e.getCause()); } catch (CancellationException e) { message = sHandler.obtainMessage(MESSAGE_POST_CANCEL, new AsyncTaskResult<Result>(AsyncTask.this, (Result[]) null)); message.sendToTarget(); return; } catch (Throwable t) { throw new RuntimeException("An error occured while executing " + "doInBackground()", t); } //8.发消息 //sHandler 是InternalHandler message = sHandler.obtainMessage(MESSAGE_POST_RESULT, new AsyncTaskResult<Result>(AsyncTask.this, result));AsyncTaskResult 是什么呢 message.sendToTarget(); } }; private static class AsyncTaskResult<Data> { final AsyncTask mTask; final Data[] mData; AsyncTaskResult(AsyncTask task, Data... data) { mTask = task; mData = data; } } private static class InternalHandler extends Handler { @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"}) @Override public void handleMessage(Message msg) { //9. AsyncTaskResult result = (AsyncTaskResult) msg.obj;//取出obj switch (msg.what) { case MESSAGE_POST_RESULT: // There is only one result //mTask 是AsyncTask //10. result.mTask.finish(result.mData[0]); break; case MESSAGE_POST_PROGRESS: result.mTask.onProgressUpdate(result.mData); break; case MESSAGE_POST_CANCEL: result.mTask.onCancelled(); break; } } } private void finish(Result result) { if (isCancelled()) result = null; //10. onPostExecute(result); mStatus = Status.FINISHED; }
相关文章推荐
- ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】
- Sublime Text 插件 autoprefixer
- 学习RxJS:Cycle.js
- 一个简单的SqlServer游标使用
- PowerEdge r730xd 安装centos 6.7
- jQueryUI tooltip 自定义提示内容
- java之路 super
- c++第七次实验
- smarty半小时快速上手入门教程
- 排序算法系列:基数排序
- 排序算法系列:基数排序
- 设计模式-10-装饰者
- [Javascript面试题]--BAT三年面试集锦之Javascript/JS面试(你一定会遇到)
- 内存问题排查手段及相关文件介绍
- HDU 1233 还是畅通工程 (最小生成树Prim)
- cc150:字符串:1.4
- Jetty:Hello World,使用main启动的简单http server
- 柴俊理金:6、16午夜黄金,宁贵沥青操作策略
- C语言中short 到 int 的扩展
- 10 movies for it