asynctask基本使用

来源:互联网 发布:手机域名是什么 编辑:程序博客网 时间:2024/06/04 07:24
1、asynctask是一个工具类
2.其实ansycktask就是对子线程和handler的一个封装。
3、自己写一个类继承AsyncTask需要三个泛型参数,第一个是你传进来的
   参数,比如是你下载的时候的url,第二个是进度的参数,第三个是返
   回值的类型,没有返回值写Void,
   class DownLoadTask extend AsyncTask<String,Integer,String>{}
4、public void clickDownLoad(View view) {
     pd = new ProgressDialog(this);
     pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
     new DownLoadTask().execute("http://www.baidu.com/lol.exe");
    }


   class DownLoadTask extends AsyncTask<String, Integer, String> {
        /**
         * 第三个执行的方法,是在后台线程中执行
         *
         * @param values
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            pd.setProgress(values[0]);
        }




        /**
         * 第四个执行,任务执行完了执行,在主线程中执行
         *
         * @param s
         */
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
   Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            pd.dismiss();
        }


        /**
         * 第一个执行的方法,在主线程中执行,这是做准备工作的
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pd.show();
        }


        /**
         * 第二个执行,更新进度的方法,在主线程中执行
         *
         * @param params
         * @return
         */
        @Override
        protected String doInBackground(String... params) {
            int temp = 0;
            while (temp <= 100) {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
          //这个方法每调用一次,onProgressUpdate就调用一次
                publishProgress(temp);
                temp++;
            }
            return "下载完成";
        }
    }


5、源码分析理解:正常的调用asynctask.excute默认的是“同步的线程池”,意思就是假如
  while(i<100){
    new DownLoadTask("任务"+i).excute("baidu,....");
    i++; 
   }
  这样只能等任务1执行完才能执行任务2,然后执行任务3,按照顺序来,如果那一个
  任务卡住了,后面的就不能执行,必须等待着前面的任务执行完。


  如果想同时的去执行这100个任务,就必须用另外一个,“并发线程池”,
  while(i<100){
  new DownLoadTask("任务"+i).excuteOnExcutor(AsyncTask.THREAD_POOL_EXCUTOR,"baidu,,,,,,,");
  i++; 
   }
0 0
原创粉丝点击