android 之AsyncTask 异步

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

public class MyAsyncTask extends AsyncTask<String, Void, String> {

    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<String, Integer, ArrayList<FeedsBean>> {
    // 2、声明属性并通过构造方法完成属性的实例化
    private Context context;
    private ArrayList<FeedsBean> 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<FeedsBean> 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<FeedsBean> 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();//取消对话框的显示
    }
}

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容