AsyncTask详解

来源:互联网 发布:华尔街英语软件课程 编辑:程序博客网 时间:2024/06/05 18:30

AsyncTask异步任务详解

我们在做网络请求数据,加载大图片,进行各种计算等等耗时操作时。常用的做法就是thread+Handler.哪里需要耗时操作哪里就new一个子线程。这种做法的灵活性很高,但是代码量也相当大。谷歌给我们提供了一个专门处理类似请求的类,这就是AsyncTask。

AsyncTask其实就是线程池+Hanlder的包装,使用AsyncTask使开发变得更加简单。

AsyncTask的四个方法详细说明

onPreExecute()

  • 调用时机:第一个调用的方法,在任务还没开始前就调用
  • 作用:通常在这里弹出一个ProgressDialog来提醒用户开始加载数据了
  • 调用线程:主线程
  • 参数:无
  • 返回值:无

doInBackground()

这个方法是必须实现的(其余三个不是必须要实现的),通常你创建的子类在继承了AsyncTask后会提示你实现这个抽象方法。

  • 调用时机:在onPreExecute方法后调用
  • 作用:处理耗时操作(如网络请求)
  • 调用线程:子线程(处理耗时操作嘛一定是子线程)
  • 参数:这个方法的参数类型由AsyncTask<String,String,String>泛型的第一个参数指定,如果泛型第一个参数是String,此处就为String。参数的值是由execute()方法传来的。
  • 返回值:就是耗时操作完成后得到的结果。要传到onPostExecute方法去更新ui.

onPostExecute()

  • 调用时机:在doInBackground方法执行完毕后调用 *
  • 作用:更新UI(各种控件,TextView,ImageView等)
  • 调用线程:主线程(子线程不能更新UI~~~)
  • 参数:参数类型,由泛型的第三个参数限定。值,doInBackground传递过来的。
  • 返回值:无

onProgressUpdate()

  • 调用时机:在手动调用publishProgress方法后调用。只有调用了publishProgress方法,此方法才生效。
  • 作用:更新UI(进度条)
  • 调用线程:主线程
  • 参数:参数类型,由泛型的第二个参数限定。值,由publishProgress方法传递。

代码示例:

以下给个简单的Demo,参照上面对方法的解释,相信大家很快就会看懂。

      `public class MainActivity extends Activity {        @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.activity_main);            new MyTask().execute("aa","bb");        }        class MyTask extends AsyncTask<String, Integer, String>{            private ProgressDialog dialog;            /**             * 弹出一个进度对话框             */            @Override            protected void onPreExecute() {                super.onPreExecute();                System.out.println("onPreExecute==========" + Thread.currentThread().getName());                dialog = new ProgressDialog(MainActivity.this);//创建一个进度条对话框                dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置为水平样式                dialog.show();            }            /**             * 处理耗时操作             */            @Override            protected String doInBackground(String... params) {                //接收exectue方法传递来的参数,可变参数通常以一个数组保存                System.out.println(params[0]);                System.out.println(params[1]);                for(int i = 1; i<=10;i++){                System.out.println("doInBackground======" +i+ Thread.currentThread().getName());                publishProgress(i,10);//每打印一次,执行一次该方法来更新进度条                SystemClock.sleep(500);//休眠0.5秒                }                return "数据被返回了...";            }            /**             * 更新ui,进度条             * 只有调用了publishProgress才执行             */            @Override            protected void onProgressUpdate(Integer... values) {                super.onProgressUpdate(values);                System.out.println("onProgressUpdate========"+ Thread.currentThread().getName());                //参数是这个publishProgress(i,10)方法传递过来的,以数组的方式取出来                dialog.setProgress(values[0]);//设置进度                dialog.setMax(values[1]);//设置进度条最大值            }            /**更新ui             *              */            @Override            protected void onPostExecute(String result) {                super.onPostExecute(result);                dialog.dismiss();//当doInBackground执行完后隐藏对话框                //接收的参数result是doInBackground返回的值                System.out.println("onPostExecute======" + Thread.currentThread().getName() + result);            }        }    }

运行结果如下:


0 0
原创粉丝点击