首先说明一下我们为什么要使用异步加载,主要原因有以下两个:
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的方法。