android AsynTask
2016-02-25 17:31
435 查看
类
public abstract class AsyncTask<Params, Progress, Result>
构造函数:
实现了Callable接口的WorkerRunnable的对象mWorker, 一般由线程池执行的FutureTask对象的mFuture;
public abstract class AsyncTask<Params, Progress, Result>
构造函数:
public AsyncTask() { mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { mTaskInvoked.set(true); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //noinspection unchecked Result result = doInBackground(mParams); Binder.flushPendingCommands(); return postResult(result); } }; mFuture = new FutureTask<Result>(mWorker) { @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); } } }; }
实现了Callable接口的WorkerRunnable的对象mWorker, 一般由线程池执行的FutureTask对象的mFuture;
public final AsyncTask<Params, Progress, Result> execute(Params... params) { return executeOnExecutor(sDefaultExecutor, params); } @MainThread public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec, Params... params) { if (mStatus != Status.PENDING) { switch (mStatus) { case RUNNING: throw new IllegalStateException("Cannot execute task:" + " the task is already running."); case FINISHED: throw new IllegalStateException("Cannot execute task:" + " the task has already been executed " + "(a task can be executed only once)"); } } mStatus = Status.RUNNING; onPreExecute(); mWorker.mParams = params; exec.execute(mFuture); return this; }
sDefaultExecutor 是 保证线程池按顺序执行任务,每次只是执行一个任务; 实现方式: private static class SerialExecutor implements Executor { final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>(); Runnable mActive; public synchronized void execute(final Runnable r) { mTasks.offer(new Runnable() { public void run() { try { r.run(); } finally { scheduleNext(); } } }); if (mActive == null) { scheduleNext(); } } protected synchronized void scheduleNext() { if ((mActive = mTasks.poll()) != null) { THREAD_POOL_EXECUTOR.execute(mActive); } } }
相关文章推荐
- Android源码及SDK国内镜像下载
- Android在点击或触摸除过EditText之外的任何地方时隐藏软键盘
- android 开发技巧(7)--附加 Ken Burns 特效的幻灯片
- android布局实践(一)home界面
- Android实战技巧之四十九:Usb通信之USB Host
- Android-PullToRefresh 快速滑动产生的大片留白问题
- android简单自定义view
- Android 通过JNI实现守护进程,使Service服务不被杀死
- android中知道图片name时获取图片的简单方法
- 实例讲解Android app开发中ListView的基本使用及优化
- Android如何判断一个应用在运行
- Android 4.x耳机插拔检测实现方法
- Android ImageView
- Android开发之SharedPreferences的使用
- 【Android基础学习】ListView 显示(数据变化后滚动到)最底部。
- The Android Gradle Plugin and Gradle version-compatibility
- Android 简单demo kill外部应用进程、卸载外部应用、安装apk
- Android项目:手机安全卫士(2)—— 版本升级
- Android应用开发中Fragment间通信的实现教程
- android4.x 耳机插拔检测机制