【AsyncTask使用】Android AsyncTask 使用完全解析

来源:互联网 发布:mac java 安装问题 编辑:程序博客网 时间:2024/05/18 03:40

代码

/**  * 该类中方法的执行顺序依次为:onPreExecute, doInBackground, onPostExecute  */    private class MyAsyncTask extends AsyncTask<String, Integer, String> {        /**         * 主线程中执行         * 在execute()被调用后首先执行         * 一般用来在执行后台任务前对UI做一些标记         */        @Override        protected void onPreExecute() {            super.onPreExecute();            System.out.println("MyAsyncTask.onPreExecute");        }        /**         * 子线程中执行,执行一些耗时操作,关键方法         * 在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。         */        @Override        protected String doInBackground(String... params) {            System.out.println("MyAsyncTask.doInBackground");            //只是模拟了耗时操作            int count = 0;            for (int i = 0; i < 10; i++) {                try {                    count++;                    publishProgress((count % 100) * 10);                    Thread.sleep(3000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            // publishProgress((int) ((count / (float) total) * 100));            return "耗时操作执行完毕";        }        /**         * 主线程中执行         * 在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件中         */        @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);            progressBar.setProgress(values[0]);            textView.setText("loading..." + values[0] + "%");            System.out.println("MyAsyncTask.onProgressUpdate");        }        /**         * 在主线程中,当后台操作结束时,此方法将会被调用         * 计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。         */        @Override        protected void onPostExecute(String aVoid) {            super.onPostExecute(aVoid);            System.out.println("MyAsyncTask.onPostExecute aVoid=" + aVoid);            textView.setText(aVoid);        }        /**         * 主线程中执行         * 当异步任务取消后的,会回调该函数。在该方法内可以更新UI         */        @Override        protected void onCancelled() {            super.onCancelled();            System.out.println("MyAsyncTask.onCancelled");            progressBar.setProgress(0);            textView.setText("0");        }        @Override        protected void onCancelled(String s) {            super.onCancelled(s);        }    }

总结

  • 首先执行onPreExecute,主线程中执行准备工作,
  • doInBackground子线程中执行耗时操作,其返回结果会传递到onPostExecute方法中,可调用publishProgress(Progress…values)来更新进度信息启动onProgressUpdate
  • onProgressUpdate(在主线程中执行)
  • onPostExecute,doInBackground执行完毕后调用这个,主线程中执行
  • onCancelled()主线程中执行,当异步任务取消回调该函数,