android抽象类AsyncTask<Params, Progress, Result>

AsyncTask这个搞安卓的都不陌生,一般继承他并实现他的4个方法:

     * @see #onPreExecute

     * @see #onPostExecute

     * @see #publishProgress

     @see #doInBackground

   其中最重要的就是doInBackground(),所有的异步操作都在doInBackground里实现,注意,ui更新等操作千万别在此方法内。


下面从源代码入手,深入谈下正确使用该类的姿势。


AsyncTask默认维护了一个线程池。

private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;

SERIAL_EXECUTOR  即   SerialExecutor。

 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);

            }

        }

    }

再看   THREAD_POOL_EXECUTOR;


  public static final Executor THREAD_POOL_EXECUTOR

            = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,

                    TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);

    private static final int CORE_POOL_SIZE = 5;

    private static final int MAXIMUM_POOL_SIZE = 128;

    private static final int KEEP_ALIVE = 1;

默认最小的线程数时5,最大的线程数时128,线程的空闲时间为1秒。


从api11 以后,为了防止发生应用层错误,只允许同时有一条线程在执行,而且默认是由SerialExecutor按顺序执行的


另外,在页面activity,fragment dialog退出的时候,如果当中调用了AsyncTask,记得cancel.否则,如果在onPostExecute中调用了

ui操作,会导致异常发生。

例子如下:当执行网络操作的时候,当服务器返回结果的时候,dialog的页面不存在,会报错。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值