韦德国际bv1946_www.bv1946com_韦德国际1946手机版
做最好的网站

Hello World

日期:2020-02-15编辑作者:韦德国际bv1946计算机

图片 1图片 2图片 3图片 4图片 5图片 6图片 7图片 8图片 9图片 10图片 11图片 12图片 13图片 14图片 15图片 16图片 17图片 18图片 19图片 20图片 21图片 22图片 23图片 24图片 25图片 26图片 27图片 28图片 29图片 30图片 31图片 32图片 33图片 34图片 35图片 36图片 37图片 38图片 39图片 40图片 41图片 42图片 43图片 44图片 45图片 46图片 47图片 48图片 49图片 50图片 51图片 52图片 53图片 54图片 55图片 56图片 57图片 58图片 59图片 60图片 61图片 62图片 63图片 64图片 65图片 66图片 67图片 68图片 69图片 70图片 71图片 72图片 73图片 74图片 75图片 76图片 77图片 78图片 79图片 80图片 81图片 82图片 83图片 84图片 85图片 86图片 87图片 88图片 89图片 90图片 91图片 92图片 93图片 94图片 95图片 96图片 97图片 98图片 99图片 100图片 101图片 102图片 1031.gif图片 104图片 105图片 106图片 107图片 108图片 109图片 110图片 111图片 112图片 113

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. 开始执行异步任务.

public final AsyncTask<Params, Progress, Result> execute(Params... params) { ... mStatus = Status.RUNNING; // 调用用户的实现方法, 让用户做一些准备操作. 运行在主线程中. onPreExecute(); // 把mWorker中的mParams赋值为用户传递进来的参数. mWorker.mParams = params; // 使用线程池, 执行任务. 这时进入到子线程中. sExecutor.execute; return this;}

// AsyncTask构造函数在一开始使用异步任务时, 已经调用.public AsyncTask() { mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { ... } }; // 1. 把mWorker对象传递给了FutureTask的构造函数 mFuture = new FutureTask<Result> { @Override protected void done() { ... } };}// FutureTask类中接收的是Callable的类型, 其实WorkerRunnable类型实现了Callable的类型.public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); // 2. 把callable传递给了Sync的构造函数. sync = new Sync;}Sync(Callable<V> callable) { // 3. 把接收过来的callable对象赋值给Sync类中的成员变量callable // 总结: Sync类中的成员变量callable就是AsyncTask中的mWorker对象. this.callable = callable;}

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的call方法. 获取一个返回结果. result = callable.call(); } catch (Throwable ex) { setException; return; } // 4. 把结果传递给set方法. set; } else { releaseShared; // cancel }}// 在AsyncTask的构造函数中, mWorker对象初始化时, 已经覆盖了call方法, 代码如下public Result call() throws Exception { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); // 3. 调用了用户实现的doInBackground方法, 去执行一个耗时的任务. 运行在子线程中. // doInBackground接收的参数就是execute方法接收的参数. return doInBackground; }

protected void set { // 5. 继续把参数传递给innerSet方法. sync.innerSet;}void innerSet { for  { int s = getState(); if  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; return; } if (compareAndSetState { // 6. 把doInBackground返回的结果赋值给成员变量result result = v; releaseShared; // 7. 调用FutureTask中的done方法. done(); return; } }}

// 此方法定义在AsyncTask的构造函数中, 初始化mFuture时,已经覆盖了done方法, 代码如下:@Overrideprotected void done() { Message message; Result result = null; try { // 8. 调用FutureTask中的get方法获取result(doInBackground返回的结果). 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,  null)); message.sendToTarget(); return; } catch (Throwable t) { throw new RuntimeException("An error occured while executing "   "doInBackground; } // 11. 创建一个消息对象. // msg.what = MESSAGE_POST_RESULT; // msg.obj = new AsyncTaskResult<Result>(AsyncTask.this, result); message = sHandler.obtainMessage(MESSAGE_POST_RESULT, new AsyncTaskResult<Result>(AsyncTask.this, result)); // 12. 把当前消息使用sHandler发送出去. message.sendToTarget();}public V get() throws InterruptedException, ExecutionException { // 9. 转调innerGet方法. return sync.innerGet();}V innerGet() throws InterruptedException, ExecutionException { ... // 10. 把result(doInBackground的结果)返回回去. result成员变量是在innerSet方法中赋值. 详情看第6步. return result;}

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  { 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); break; case MESSAGE_POST_CANCEL: result.mTask.onCancelled(); break; } }}private void finish(Result result) { if (isCancelled result = null; // 14. 把doInBackground的返回结果传递给用户实现的onPostExecute方法. 运行在主线程中, 用户可以做一些操作界面, 更新界面的操作. onPostExecute; mStatus = Status.FINISHED;}

本文由韦德国际bv1946手机版发布于韦德国际bv1946计算机,转载请注明出处:Hello World

关键词: World