AsyncTask异步任务

来源:互联网 发布:舒尔se315 知乎 编辑:程序博客网 时间:2024/05/22 06:14

public abstract class AsyncTask<Params, Progress, Result> {
* 三种泛型类型分别代表“启动任务执行的输入参数 String”、“后台任务执行的进度 Integer”、“后台计算结果的类型 String”
* 在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用Java.lang.Void类型代替
注意:这里是泛型参数

使用的步骤及方法
创建一个自己的异步任务类继承AsyncTask,,,并重写里面的方法
* 方法
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。

                        2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些操作。

3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。

                           在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
*  protected String doInBackground(String... params)
* 参数是可变参数,,,params[0]
*  HttpGet get = new HttpGet(params[0]); 
*  可以返回请求的数据,,,,然后在下面的方法onPostExecute接收进行操作

4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。

5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上

* onCancelled()
        * 取消一个正在执行的任务,onCancelled方法将会被调用  
                mTask.cancel(true);

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

/**

 *展示异步任务的所有方法
 */
private void asyncAll() {
    //需要一个异步任务对象....在异步任务中去处理耗时的操作,比如获取网络...是放在子线程中(后台线程中)
    /**
     * 有三个泛型参数...这三个泛型参数都可以为空...Void
     * Params 一般值得是执行任务的时候传递过来的数据,,,,一般是访问的url,,,可以为空Void
     * Progress 当前这个任务执行的进度...如果需要的话一般是Integer,,,,不需要为空Void
     * Result 异步任务执行完成以后返回的结果,,,如果没有结果Void,,,如果有指定返回值的泛型,一般访问网络返回的是json字符串...String
     */
    AsyncTask<String, Void, String> asyncTask = new AsyncTask<String, Void, String>() {
        //在doInBackground之前调用的方法,,,也就是异步任务开始执行的第一个方法
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        //在后台执行的方法....相当于子线程...执行耗时的操作...不能再这个方法里面更新界面
        @Override
        protected String doInBackground(String... strings) {
            try {
                URL url = new URL(strings[0]);

                HttpURLConnection connection = (HttpURLConnection) url.openConnection();

                connection.setRequestMethod("GET");
                connection.setReadTimeout(5000);
                connection.setConnectTimeout(5000);

                int responseCode = connection.getResponseCode();
                if (responseCode == 200){
                    InputStream inputStream = connection.getInputStream();

                    //publishProgress();

                    String json = streamToString(inputStream,"utf-8");

                    //json字符串已经获取到,,,也就是异步任务执行的结果获取到了
                    return json;
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
                return null;
            }

        //异步任务执行进度发生改变的时候调用的方法,,,这个方法不会自动调用,,需要在doInBackGroud里面调用publishProgress()方法的时候会调用onProgressUpdate
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

        //发送任务执行的结果到主线程,,,,这个方法是处于主线程,,,可以更新界面
        //String json就是doInBackground返回的数据
        @Override
        protected void onPostExecute(String json) {
            //json是doInBackgroud返回的,,,此时在这里可以进行解析,,设置适配器的操作
            
        }

        //异步任务取消的时候执行的方法...asyncTask.cancel(true);执行的时候会自动执行onCancelled
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
    };

    //异步任务对象如果需要执行,需要调用下面的方法.....
    asyncTask.execute(网络地址);

    //asyncTask.cancel(true);

}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

/**

 *常用

 */

AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... voids) {
            String path = "http://v.juhe.cn/toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653";
            try {
                URL url = new URL(path);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();

                connection.setRequestMethod("GET");
                connection.setReadTimeout(5000);
                connection.setConnectTimeout(5000);

                int responseCode = connection.getResponseCode();
                if (responseCode == 200){
                    InputStream inputStream = connection.getInputStream();
                    String json = streamToString(inputStream,"utf-8");

                    //json字符串已经获取到,,,也就是异步任务执行的结果获取到了
                    return json;
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
                return null;
            }


        @Override
        protected void onPostExecute(String s) {
            //返回的数据可以解析
        }
    };


    //调用
    asyncTask.execute();

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

在使用AsyncTask的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。