android 之AsyncTask 异步

前一段时间面试的时候竟然有人问这个东西,说实话这东西一般应该很少用到了吧,当然问到这东西我只能说一脸懵逼,只是依稀记得有这么个东西,自定义类并且继承继承。当然之所以使用异步那就是因为UI线程不能进行耗时操作。子线程又不可以进行UI操作,这个异步是用来加载网络数据的很少用到。网络框架那么多。。。。。。。写一下简单用法吧
第一步自定义类继承AsyncTask
并指明三大泛型的数据类型
1、AsyncTask三大泛型说明:
Params:请求的网址,String/URL
Progress:进度的数据类型,Integer/Void
Result:结果的数据类型,String/byte[]/BitMap/ArrayList/具体的类型
第二步
1、重写必须的方法
doInBackground:开启子线程请求网络数据,在这个方法内部不能操作UI控件
onPostExecute:更新UI控件
2、重写非必须方法
onPreExecute():执行子线程之前调用,常常用于进度对话框或进度条的显示
onProgressUpdate(Progress... values) :更新进度
先写一个Http的后面再写一个OKhttp的

public class MyAsyncTask extends AsyncTask {

    private Context context;

    private getResult mGetResult;

    //初始化
    public MyAsyncTask(Context context, TextView tv, getResult getResult) {
        // TODO Auto-generated constructor stub
        this.context = context;
        mGetResult = getResult;
    }

    //开启子线程执行网络请求
    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        //HTTP协议
        HttpURLConnection huc = null;
        InputStream is = null;
        try {
            //1、创建URL对象
            URL url = new URL(params[0]);
            //2、创建HttpURLConnection对象
            huc = (HttpURLConnection) url.openConnection();
            //3、设置请求信息
            huc.setConnectTimeout(3000);
            //4、连接
            huc.connect();
            //5、验证状态响应码
            if (huc.getResponseCode() == 200) {
                //6、获取响应数据
                is = huc.getInputStream();
                int len;
                byte[] data = new byte[1024];
                StringBuilder builder = new StringBuilder();
                while ((len = is.read(data)) != -1) {
                    builder.append(new String(data, 0, len));
                }
                return builder.toString();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            //7、关闭
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (huc != null) {
                huc.disconnect();
            }
        }
        return null;
    }

    //更新UI控件的内容
    @Override
    protected void onPostExecute(String result) {
        if (result != null) {
            mGetResult.getResults(result);//数据回调
        } else {
            Toast.makeText(context, "当前无网络,请稍后再试", Toast.LENGTH_LONG).show();
        }
    }

    public interface getResult {
        void getResults(String s);
    }
}

activity中使用方法

  /*Activity使用异步任务的步骤:
         * 1、创建异步任务对象
        * 2、执行*/
        //创建异步任务对象
        MyAsyncTask asyncTask = new MyAsyncTask(this, tv, new MyAsyncTask.getResult() {
            @Override
            public void getResults(String s) {
                tv.setText(s);//拿到回调回来的数据
            }
        });
        //执行异步任务 后面是链接
        asyncTask.execute("http://litchiapi.jstv.com/api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=511D3BE5301280E0992C73A9DEC41");

上边是一个很简单的异步的使用,并且使用了接口回调的方式将数据带回。

public class NewsAsyncTask extends AsyncTask> {
    // 2、声明属性并通过构造方法完成属性的实例化
    private Context context;
    private ArrayList listData;
    private ProgressDialog pd;// 声明进度对话框对象

    public NewsAsyncTask(Context c) {
        // TODO Auto-generated constructor stub
        context = c;
        listData = new ArrayList<>();
    }

    // 3、重写方法
    // 开启子线程并请求网络
    // 开启子线程之前执行
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        //实例化对象
        pd = new ProgressDialog(context);
        pd.setTitle("加载提醒");//设置标题
        pd.setIcon(R.mipmap.ic_launcher);//设置对话框的图标
        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);//设置对话框的样式
        pd.setMessage("请稍等,数据正在加载中……");//设置提示信息
        pd.show();//显示对话框
    }

    @Override
    protected ArrayList doInBackground(String... params) {
        // TODO Auto-generated method stub
        try {
            OkHttpClient okHttpClient = new OkHttpClient();//创建OkHttpClient对象
            Request request = new Request.Builder()
                    .url(params[0])//接口地址
                    .build();//创建request
            Response response = okHttpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                Gson gson = new Gson();
                MyTest bew = new Gson().fromJson(response.body().string(), MyTest.class);
                listData.addAll( bew.getParamz().getFeeds());
                return listData;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(ArrayList result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        if (result != null) {
            Log.e("=======>>>", result.size() + "");//返回数据结果
        } else {
            Toast.makeText(context, "网络异常,请稍后再试", Toast.LENGTH_LONG).show();
        }
        pd.dismiss();//取消对话框的显示
    }
}

这个是添加了一个对话框的。简单的使用就这些吧

你可能感兴趣的:(android 之AsyncTask 异步)