Android AsyncTask源码中 SerialExecutor类有什么作用?

千里山南 发布于 2013/08/13 20:13
阅读 2K+
收藏 0

如题

Android AsyncTask源码中 SerialExecutor类有什么作用?

感觉直接使用 THREAD_POOL_EXECUTOR执行也可以,看了半天感觉源码中做法意义不明显,烦请高手指点。

加载中
0
刎枫

一个顺序 一个异步 当然不一样。

看一下AsyncTask的文档吧。Order of execution部分

http://developer.android.com/reference/android/os/AsyncTask.html

0
千里山南
千里山南

引用来自“刎枫”的答案

一个顺序 一个异步 当然不一样。

看一下AsyncTask的文档吧。Order of execution部分

http://developer.android.com/reference/android/os/AsyncTask.html

SerialExecutor只是保证了提交到THREAD_POOL_EXECUTOR的顺序,对结果的影响不大吧。。。
0
刎枫

引用来自“千里山南”的答案

引用来自“刎枫”的答案

一个顺序 一个异步 当然不一样。

看一下AsyncTask的文档吧。Order of execution部分

http://developer.android.com/reference/android/os/AsyncTask.html

SerialExecutor只是保证了提交到THREAD_POOL_EXECUTOR的顺序,对结果的影响不大吧。。。
0
千里山南
千里山南

引用来自“刎枫”的答案

引用来自“千里山南”的答案

引用来自“刎枫”的答案

一个顺序 一个异步 当然不一样。

看一下AsyncTask的文档吧。Order of execution部分

http://developer.android.com/reference/android/os/AsyncTask.html

SerialExecutor只是保证了提交到THREAD_POOL_EXECUTOR的顺序,对结果的影响不大吧。。。


222    private static class SerialExecutor implements Executor {
223        final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
224        Runnable mActive;
225
226        public synchronized void execute(final Runnable r) {
227            mTasks.offer(new Runnable() {
228                public void run() {
229                    try {
230                        r.run();
231                    } finally {
232                        scheduleNext();
233                    }
234                }
235            });
236            if (mActive == null) {
237                scheduleNext();
238            }
239        }
240
241        protected synchronized void scheduleNext() {
242            if ((mActive = mTasks.poll()) != null) {
243                THREAD_POOL_EXECUTOR.execute(mActive);
244            }
245        }
246    }
你是说的这段代码吧,他最终不是保证了
THREAD_POOL_EXECUTOR.execute(mActive);


的执行么,但具体 THREAD_POOL_EXECUTOR怎么执行他好像还是无法保证吧?再者来说,保证执行顺序意义也不大,AsyncTask不是可以保证最低5线程并发执行么?




0
刎枫

引用来自“千里山南”的答案

引用来自“刎枫”的答案

引用来自“千里山南”的答案

引用来自“刎枫”的答案

一个顺序 一个异步 当然不一样。

看一下AsyncTask的文档吧。Order of execution部分

http://developer.android.com/reference/android/os/AsyncTask.html

SerialExecutor只是保证了提交到THREAD_POOL_EXECUTOR的顺序,对结果的影响不大吧。。。


222    private static class SerialExecutor implements Executor {
223        final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
224        Runnable mActive;
225
226        public synchronized void execute(final Runnable r) {
227            mTasks.offer(new Runnable() {
228                public void run() {
229                    try {
230                        r.run();
231                    } finally {
232                        scheduleNext();
233                    }
234                }
235            });
236            if (mActive == null) {
237                scheduleNext();
238            }
239        }
240
241        protected synchronized void scheduleNext() {
242            if ((mActive = mTasks.poll()) != null) {
243                THREAD_POOL_EXECUTOR.execute(mActive);
244            }
245        }
246    }
你是说的这段代码吧,他最终不是保证了
THREAD_POOL_EXECUTOR.execute(mActive);


的执行么,但具体 THREAD_POOL_EXECUTOR怎么执行他好像还是无法保证吧?再者来说,保证执行顺序意义也不大,AsyncTask不是可以保证最低5线程并发执行么?




同一时间pool中只有一个task在执行。。。

有没有意义不能随便断言,如果前后Task是依赖关系的,必须要顺序执行。

实在不行你自己写一个demo,你写一个demo验证一下你的说法吧。

返回顶部
顶部