Android_AsyncTask

android学习之AsyncTask

AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程.

构建AsyncTask子类的泛型参数

AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承.继承AsyncTask需要指定如下三个泛型参数:

Params:启动任务时输入的参数类型.

Progress:后台任务执行中返回进度值的类型.

Result:后台任务执行完成后返回结果的类型.

构建AsyncTask子类的回调方法

AsyncTask主要有如下几个方法:

doInBackground:必须重写,异步完成耗时操作

onPreExecute:执行后台耗时操作前被调用,通常用于进行初始化操作、初始化进度条.

onPostExecute:当doInBackground方法完成后,系统将自动调用此方法,并将doInBackground方法返回的值传入此方法.通过此方法进行UI的更新.

onProgressUpdate:当在doInBackground方法中调用publishProgress方法更新任务执行进度后,将调用此方法.通过此方法我们可以知晓任务的完成进度.

使用方式eg一:实例化对象

 1 class MyAsyncTask extends AsyncTask<String,Void,Bitmap> {
 2 
 3         //onPreExecute用于异步处理前的操作
 4         @Override
 5         protected void onPreExecute() {
 6             super.onPreExecute();
 7             //此处将progressBar设置为可见.
 8             progressBar.setVisibility(View.VISIBLE);
 9         }
10 
11         //在doInBackground方法中进行异步任务的处理.
12         @Override
13         protected Bitmap doInBackground(String... params) {
14             //获取传进来的参数
15             String url = params[0];
16             Bitmap bitmap = null;
17             URLConnection connection ;
18             InputStream is ;
19             try {
20                 connection = new URL(url).openConnection();
21                 is = connection.getInputStream();
22                 BufferedInputStream bis = new BufferedInputStream(is);
23                 //通过decodeStream方法解析输入流
24                 bitmap = BitmapFactory.decodeStream(bis);
25                 is.close();
26                 bis.close();
27             } catch (IOException e) {
28                 e.printStackTrace();
29             } catch (InterruptedException e) {
30                 e.printStackTrace();
31             }
32             return bitmap;
33         }
34 
35         //onPostExecute用于UI的更新.此方法的参数为doInBackground方法返回的值.
36         @Override
37         protected void onPostExecute(Bitmap bitmap) {
38             super.onPostExecute(bitmap);
39             //隐藏progressBar
40             progressBar.setVisibility(View.GONE);
41             //更新imageView
42             imageView.setImageBitmap(bitmap);
43         }
44     }

使用方法二:匿名对象使用(线程池引入)

1.    public static ExecutorService LIMITED_TASK_EXECUTOR;

2.    static {
        LIMITED_TASK_EXECUTOR = Executors.newFixedThreadPool(15);
    }

3.    new AsyncTask<Void,Void,Boolean>(){
            @Override
            protected Boolean doInBackground(Void... voids) {
                Boolean result=TALKSDK.getInstance().startRealPlay(0,CommUtils.getString("deviceserIal",null,getApplicationContext()),deviceNo,call_surfaceView,mHandler);
                return result;
            }
            
            protected void onPostExecute(Boolean result) {
                if(result){
                    Toaster.showShort(
                            VideoModuleActivity.this, "预览成功");
                }else{
                    Toaster.showShort(
                            VideoModuleActivity.this, "预览失败");
                }
            };
        }.executeOnExecutor(LIMITED_TASK_EXECUTOR);

使用方法三:进度条更新

class MyAsyncTask extends AsyncTask<Void,Integer,Void>{
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            //通过publishProgress方法传过来的值进行进度条的更新.
            progressBar.setProgress(values[0]);
        }

        @Override
        protected Void doInBackground(Void... params) {
            //使用for循环来模拟进度条的进度.
            for (int i = 0;i < 100; i ++){
                //如果task是cancel状态,则终止for循环,以进行下个task的执行.
                if (isCancelled()){
                    break;
                }
                //调用publishProgress方法将自动触发onProgressUpdate方法来进行进度条的更新.
                publishProgress(i);
                try {
                    //通过线程休眠模拟耗时操作
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    }

使用AsyncTask的注意事项

① 必须在UI线程中创建AsyncTask的实例.

② 只能在UI线程中调用AsyncTask的execute方法.

③ AsyncTask被重写的四个方法是系统自动调用的,不应手动调用.

④ 每个AsyncTask只能被执行(execute方法)一次,多次执行将会引发异常.

⑤ AsyncTask的四个方法,只有doInBackground方法是运行在其他线程中,其他三个方法都运行在UI线程中,也就说其他三个方法都可以进行UI的更新操作.

注:本文参考文章http://www.cnblogs.com/caobotao/p/5020857.html如有疑问请联系删除

原文地址:https://www.cnblogs.com/rainbowLover/p/10430640.html