Android 异步加载(一)

首先说明一下我们为什么要使用异步加载,主要原因有以下两个:
1、使用异步加载可以提高用户体验,在加载数据时不会出现明显卡顿;
2、由于Android是单线程模型,耗时操作会阻塞UI线程,所以要放到单独的线程中去做。

实现异步加载的方式主要有以下两种:
1、使用多线程/线程池实现异步加载
2、使用AsyncTask实现

这次使用ListView加载网络图片的小例子来讲解异步加载的原理和方法。
搭建好布局之后,我们需要网络请求来获取数据,现在就需要用到AsyncTask的相关知识获取网络数据。
1、在MainActivity中创建一个内部类来实现AsyncTask,我们就叫它NewsAsyncTask:

 class NewsAsyncTask extends AsyncTask<String, Void, List<NewsBean>> {
        @Override
        protected List<NewsBean> doInBackground(String... params) {
            return getJsonData(params[0]);
        }


        @Override
        protected void onPostExecute(List<NewsBean> newsBeen) {
            super.onPostExecute(newsBeen);

            NewsAdapter adapter = new NewsAdapter(MainActivity.this, newsBeen, mListView);
            mListView.setAdapter(adapter);
        }
    }

说一下AsyncTask的三个参数,第一个是我们要传入的请求网络的URL,所以定义为String;第二个是记录中间过程,我们不需要记录,故定义为Void;第三个是返回值,我们请求完网络需要返回一个json的数据,我们在这里将它封装在NewsBean里,作为返回值,至于下边重写的onPostExecute方法,我们一会再说。
1.1 创建json数据的封装类 NewsBean
我们需要的数据很简单,所以创建的NewsBean也很简单,只需要三个属性:

public class NewsBean {

    public String newsIconUrl;//新闻的标题图片url
    public String newsTitle;//新闻标题
    public String newsContent;//新闻内容(简介)


}

好,我们的NewsBean就创建完成了。
1.2 创建完封装类,我们回到之前的NewsAsyncTask方法中,我们要在AsyncTask的doInBackground的方法中获取到传入的URL,也就是我们要请求的网址,然后通过这个api返回json格式的数据:

 @Override
        protected List<NewsBean> doInBackground(String... params) {
            return getJsonData(params[0]);
        }

也就是这一句,其中params[0]就是我们请求的网址,getJsonData是我们创建的获取json数据的方法。

1.2.1 创建getJsonData的方法:

 private List<NewsBean> getJsonData(String url) {
        List<NewsBean> newsBeanList = new ArrayList<>();

        try {
            String jsonString = readStream(new URL(url).openStream());
            JSONObject jsonObject;
            NewsBean newsBean;

            jsonObject = new JSONObject(jsonString);
            JSONArray jsonArray = jsonObject.getJSONArray("data");
            for (int i = 0; i < jsonArray.length(); i++) {
                jsonObject = jsonArray.getJSONObject(i);
                newsBean = new NewsBean();
                newsBean.newsIconUrl = jsonObject.getString("picSmall");
                newsBean.newsTitle = jsonObject.getString("name");
                newsBean.newsContent = jsonObject.getString("description");

                newsBeanList.add(newsBean);
            }


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

以上便是getJsonData的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值