重要:在build.gradle的android下加入一句话useLibrary 'org.apache.http.legacy'(原因:HttpClient已过时)
代码演示
JAVA
package com.bawei.zhangjinfeng20171105.frag;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.bawei.zhangjinfeng20171105.R;
import com.bawei.zhangjinfeng20171105.bean.Bean;
import com.bawei.zhangjinfeng20171105.util.Netstateutil;
import com.bawei.zhangjinfeng20171105.util.Netutil;
import com.google.gson.Gson;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Created by sky on 2017/11/05.
*/
public class Two extends Fragment {
private ListView lv;
List<Bean.NewslistBean> list=new ArrayList<>();
private Myadaper m;
String surl="https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10";
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.f1_list, container, false);
lv = view.findViewById(R.id.lv);
return view;
}@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
m = new Two.Myadaper();
lv.setAdapter(m);
//创建数组用于判断
String[] s={surl,"HttpClient"}; //获取网络连接的类型
int type = Netstateutil.getNewType(getActivity());
if(type!=-1){
Toast.makeText(getActivity(),"我有网络",Toast.LENGTH_SHORT).show();
AsyncTask<String, Void, String> execute = new MAsyncTask().execute(s);
}else{
Toast.makeText(getActivity(),"请检查网络",Toast.LENGTH_SHORT).show();
}
}
public class Myadaper extends BaseAdapter {
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view==null){
view=View.inflate(getActivity(),R.layout.aa,null);
}
TextView tv=view.findViewById(R.id.tv);
ImageView iv=view.findViewById(R.id.iv);
tv.setText(list.get(i).getDescription());
//用AsyncTask1传过去有参ImageView控件和接口.刷新图片
new MAsyncTask1(iv).execute(list.get(i).getPicUrl());
return view;
}
}
/**
* 泛型 第一个参数:传过来的url
* 第二个参数 :进度
* 第三个参数 :接口请求成功返回的东西(json,bitmap)
*/
private class MAsyncTask1 extends AsyncTask<String,Void,Bitmap> {
ImageView iv;
public MAsyncTask1(ImageView iv) {
this.iv=iv;
}
/**
* 这个方法在子线程,在这个方法里进行联网操作
* @param strings 可变参数,底层是数组,里面放的是传过来的参数;
* @return
*/
@Override
protected Bitmap doInBackground(String... strings) {
String string = strings[0];
Bitmap bit = Netutil.getNetBitmap(string);
return bit;
}
/**
* 这个方法在主线程, 直接更新ui即可;
* @param s s是doInBackground请求接口成功后返回的json
*/
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
iv.setImageBitmap(bitmap);
}
}
private class MAsyncTask extends AsyncTask<String,Void,String> {
//这是子线程
@Override
protected String doInBackground(String... strings) {
String url = strings[0];
String ss = strings[1];
if(ss.equals("HttpClient")) {
//得到httpclient对象
DefaultHttpClient client = new DefaultHttpClient();
//封装get请求
HttpGet hg = new HttpGet(url);
//获取返回的response
try {
//修改org.apache.http的主机名验证解决问题
SSLSocketFactory.getSocketFactory().setHostnameVerifier(new AllowAllHostnameVerifier());
HttpResponse response = client.execute(hg);
//获取状态码
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
//entiry 里面封装的数据;
HttpEntity entity = response.getEntity();
//这个result就是json字符串,剩下的就是解析工作了;
String s = EntityUtils.toString(entity);
return s;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
//这个是主线程
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//解析s, 直接给控件展示;
Gson g=new Gson();
Bean bean = g.fromJson(s, Bean.class);
List<Bean.NewslistBean> newslist = bean.getNewslist();
list=newslist;
m.notifyDataSetChanged();
}
}
}
其他所需类详见
点击打开链接(网络连接+HttpUrlConnection+AsyncTask)