简述:用defaultHttpClient 获取去网络json数据,在AsyncTask中获取图片和文字,并赋值到listView,由于网络获取是费时操作所以需要在子线程中运行。
第一步:添加依赖
useLibrary ‘org.apache.http.legacy’
implementation ‘com.google.code.gson:gson:2.8.5’
第二步:初始化组件开启、子线程(布局里只有一个listview)
在UI线程开启子线程,调用AsyncTask方法,传入字符串
new Thread(){
@Override
public void run() {
super.run();
new Myasync().execute(urlString);
}
}.start();
第三步:继承AsyncTask方法<传进值得类型,更新进度类型,返回值类型>
**重写onPostExecute方法在其中可更新UI
class Myasync extends AsyncTask<String,Void,String>{
@Override
protected String doInBackground(String... strings) {
String json = Net.getJson(strings[0]);
return json;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Gson gson = new Gson();
ArrayList<Data> data = gson.fromJson(s, JsonData.class).getData();
MyAdapter myAdapter = new MyAdapter(data,getActivity());
listView.setAdapter(myAdapter);
}
}
第四步:配置适配器,用AsyncTask添加布局中的图片
public class MyAdapter extends BaseAdapter {
ArrayList<Data> data;
Context context;
public MyAdapter(ArrayList<Data> data, Context context) {
this.data = data;
this.context = context;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Horder horder = null;
if(convertView==null){
convertView = View.inflate(context, R.layout.item,null);
horder = new Horder();
horder.imageView = convertView.findViewById(R.id.item_image);
horder.textView = convertView.findViewById(R.id.itmet_text);
convertView.setTag(horder);
}else{
horder = (Horder) convertView.getTag();
}
horder.textView.setText(data.get(position).getNews_title());
String pic_url = data.get(position).getPic_url();
//Picasso.with(context).load(data.get(position).getPic_url()).into(horder.imageView);
new MyAsynctask(horder.imageView).execute(pic_url);
return convertView;
}
class Horder{
ImageView imageView;
TextView textView;
}
class MyAsynctask extends AsyncTask<String,Void,Bitmap>{
ImageView iv;
public MyAsynctask(ImageView iv) {
this.iv = iv;
}
@Override
protected Bitmap doInBackground(String... strings) {
Bitmap bitmap = Net.getBitmap(strings[0]);
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
iv.setImageBitmap(bitmap);
}
}