AsyncTask源码分析

本文主要围绕AsyncTask的源码对其进行原理分析,帮助理解AsyncTask工作流程以及更好的运用, 若发现错误的地方望告知
	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) {

		}
		// 任务进度更新 运行在主线程
		protected void onProgressUpdate(String... values) {
			
			}

		// 任务被取消时执行 运行在主线程
		protected void onCancelled(String result) { 
			
			}
	}.execute(String... params);	// 1. 开始执行异步任务.
要想启动AsyncTask我们就必须执行execute的方法, 那我们就从这个函数开始 代码如下:
public final AsyncTask<Params, Progress, Result> execute(Params... params) {
        ...

        mStatus = Status.RUNNING;

		// 这里在创建AsyncTask的构造对象里调用了onPreExecute 运行在当前线程中.
        onPreExecute();

		// 把mWorker中的mParams赋值为用户传递进来的参数.
        mWorker.mParams = params;
		// sExecutor使用线程池, 执行任务. 这时进入到子线程中.
// AsyncTask构造函数在一开始使用异步任务时, 已经调用.
	public AsyncTask() {
        mWorker = new WorkerRunnable<Params, Result>() {
            public Result call() throws Exception {
                ...
            }
        };

		// 1. 把mWorker对象传递给了FutureTask的构造函数
        mFuture = new FutureTask<Result>(mWorker) {
            @Override
            protected void done() {
                ...
            }
        };
    }

sExecutor.execute(mFuture); return this; }

 查看mWorker的初始化过程, 代码如下:
// AsyncTask构造函数在一开始使用异步任务时, 已经调用.
	public AsyncTask() {
        mWorker = new WorkerRunnable<Params, Result>() {
            public Result call() throws Exception {
                ...
            }
        };

		// 1. 把mWorker对象传递给了FutureTask的构造函数
        mFuture = new FutureTask<Result>(mWorker) {
            @Override
            protected void done() {
                ...
            }
        };
    }

// FutureTask类中接收的是Callable的类型, 其实WorkerRunnable类型实现了Callable的类型. 代码如下

public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
		// 2. 把callable(mWorker)传递给了Sync的构造函数.
        sync = new Sync(callable);
    }

    Sync(Callable<V> callable) {
 		// 3. 把接收过来的callable(mWorker)对象赋值给Sync类中的成员变量callable
		// 总结: Sync类中的成员变量callable就是AsyncTask中的mWorker对象.
        this.callable = callable;
    }

	 mFuture对象中的run方法如下:
		public void run() {
			// 1. 调用了innerRun方法.
	        sync.innerRun();
	    }

    void innerRun() {
        if (!compareAndSetState(READY, RUNNING))
            return;

        runner = Thread.currentThread();
        if (getState() == RUNNING) { // recheck after setting thread
            V result;
            try {
				// 2. 调用了callable(mWorker)的call方法. 获取一个返回结果.
                result = callable.call();
            } catch (Throwable ex) {
                setException(ex);
                return;
            }
			// 4. 把结果传递给set方法.
            set(result);
        } else {
            releaseShared(0); // cancel
        }
    }
在AsyncTask的构造函数中, mWorker对象初始化时, 已经覆盖了call方法, 代码如下

public Result call() throws Exception {
        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
		// 3. 调用了用户实现的doInBackground方法, 去执行一个耗时的任务. 运行在子线程中.
		// doInBackground接收的参数就是execute方法接收的参数.
        return doInBackground(mParams);	
    }
	 protected void set(V v) {
			// 5. 继续把参数传递给innerSet方法.
	        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)) {
				// 6. 把doInBackground返回的结果赋值给成员变量result
                result = v;
                releaseShared(0);
				// 7. 调用FutureTask中的done方法.
                done();
                return;
            }
        }
    }

此方法定义在AsyncTask的构造函数中, 初始化mFuture时,已经覆盖了done方法, 代码如下:
@Override
    protected void done() {
             try {
                    postResultIfNotInvoked(get());
                } catch (InterruptedException e) {
                    android.util.Log.w(LOG_TAG, e);
                } catch (ExecutionException e) {
                    throw new RuntimeException("An error occurred while executing doInBackground()",
                            e.getCause());
                } catch (CancellationException e) {
                    postResultIfNotInvoked(null);
                }
            }
		
    }

    private void postResultIfNotInvoked(Result result) {
        final boolean wasTaskInvoked = mTaskInvoked.get();
        if (!wasTaskInvoked) {
            postResult(result);
        }
    }


    private Result postResult(Result result) {
        @SuppressWarnings("unchecked") // 拿到已经创建的Handle
        Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT,
                new AsyncTaskResult<Result>(this, result));
        message.sendToTarget(); // 发送到MessageQueue
        return result;
    }

	// 创建的handle
    private static Handler getHandler() {
        synchronized (AsyncTask.class) {
            if (sHandler == null) {
                sHandler = new InternalHandler();
            }
            return sHandler;
        }
    }
最后我们来看看在handler里的逻辑处理

private static class InternalHandler extends Handler {
	    @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
	    @Override
	    public void handleMessage(Message msg) {
			// 把obj转换成AsyncTaskResult类, 这个类中mTask对象就是当前的AsyncTask对象. mData对象就是doInBackground的返回结果.
	        AsyncTaskResult result = (AsyncTaskResult) msg.obj;
	        switch (msg.what) {
	            case MESSAGE_POST_RESULT:
	                // There is only one result
					// 13. 调用AsyncTask中的finish方法, 并且把doInBackground的返回结果传递进去.
	                result.mTask.finish(result.mData[0]);
	                break;
	            case MESSAGE_POST_PROGRESS:
	                result.mTask.onProgressUpdate(result.mData); // 这里的函数也是经常用到通常更新ui进度
	                break;
	            case MESSAGE_POST_CANCEL:
	                result.mTask.onCancelled();
	                break;
	        }
	    }
	}

   
	  private void finish(Result result) {
	        if (isCancelled()) {
	            onCancelled(result); // 这里执行取消操作
	        } else {
	            onPostExecute(result);
	             // 14. 把doInBackground的返回结果传递给用户实现的onPostExecute方法. 运行在主线程中, 用户可以做一些操作界面, 更新界面的操作.
	        }
	        mStatus = Status.FINISHED;
	    }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android网络连接分析主要涉及到Android系统中网络连接的相关实现和机制。下面是Android网络连接的分析: 1. 网络连接管理类:Android中的网络连接管理由ConnectivityManager类负责。该类提供了获取网络状态、监听网络状态变化等功能。其码位于frameworks/base/core/java/android/net/ConnectivityManager.java。 2. 网络请求类:Android中的网络请求由HttpClient或HttpURLConnection实现。在Android 6.0及以上版本中,Google推荐使用HttpURLConnection。HttpClient的码位于frameworks/base/core/java/org/apache/http/impl/client/DefaultHttpClient.java,HttpURLConnection的码位于libcore/luni/src/main/java/java/net/HttpURLConnection.java。 3. 网络请求处理类:Android中的网络请求处理由AsyncTask或者Thread实现。AsyncTask是一个封装了线程池和Handler的异步任务类,用于在后台执行耗时操作,并在主线程更新UI。其码位于frameworks/base/core/java/android/os/AsyncTask.java。 4. 网络请求结果处理类:Android中的网络请求结果处理由Handler或者Callback实现。Handler用于在主线程中处理异步任务的结果,Callback则是一种回调机制,用于在异步任务完成后执行相应的操作。 5. 网络缓存类:Android中的网络缓存由DiskLruCache或者LruCache实现。DiskLruCache用于将网络请求结果缓存到本地磁盘,LruCache则是一种内存缓存机制,用于缓存网络请求结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值