android两种异步实现方式总结(一)

来源:互联网 发布:什么域名代表公司 编辑:程序博客网 时间:2024/06/05 01:05

第一种:AsyncTask

AsyncTaskandroid提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度,最后反馈执行结果给UI主线程。它比Handler更轻量级。

一个task实例只能调用一次。

AsyncTask提供了三种泛型参数,并重载至少一个方法。

三个参数:

parames:启动任务输入的参数,比如url

progress:后台执行任务的百分比

result:后台执行任务最终返回的结果

     几个方法:

doInBackground(params..):耗时的后台操作,这里不能进行ui主线程更新操作,可以用publishProgress来更新进度

onPostExecute(Result):类似于Handler中更新UI主线程

onProgressUpdate(Progress...):增加进度条,提高用户体验度

onCancelled():用户调用取消时要做的操作

    优点:

简单,快捷

过程可控

   缺点:

在使用多个异步操作并需要进行UI更新时就变得复杂起来

 

   使用场景:

改善设计,少用异步,线程的开销是很大的

与主线程有交互时使用AsyncTask,否则用Thread即可

对于有需要大量线程执行任务时,一定要创作线程池

对于想要立即开始执行的异步任务,要么直接使用Thread,要么单独创建线程池提供给AsyncTask

1. task.executeOnExecutor(Executors.newCachedThreadPool()); 无限制线程池

2. Executors.newFixedThreadPool(7);最大值为7的线程池

3. Executors.newSingleThreadExecutor():单个线程的线程池

 

代码:

public class MyAsyncTask extends AsyncTask<Integer, Integer, String>

{

    private ProgressBar progressBar;   

    public MyAsyncTask(ProgressBar progressBar)

    {

        super();

        this.progressBar = progressBar;

    }

    @Override

    protected String doInBackground(Integer... arg0)

    {

        int i = 0;

        for (i = 0; i <= 100; i += 10)

        {

            try

            {

                Thread.sleep(300);

            }

            catch (InterruptedException e)

            {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

            publishProgress(i);

        }

        String result = (i - 10) + arg0[0].intValue() + "";

        return result;

    }

    @Override

    protected void onPostExecute(String result)

    {

    }

    @Override

    protected void onPreExecute()

    {

    }

    @Override

    protected void onProgressUpdate(Integer... values)

    {

        int value = values[0];

        progressBar.setProgress(value);

    }

}

0 0
原创粉丝点击