Httpurlconnection进行网络请求+ListView**
- 第一步:找控件设置值监听在MainActivity中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//第一步:找控件设置值监听
findViewById(R.id.button2).setOnClickListener(this);
listView = findViewById(R.id.listView);
2.设置点击事件创建Http以及创建MyAsyncTask类
@Override
public void onClick(View v) {
switch (v.getId()) {
//第二部:点击事件
case R.id.button2:
//第三部:创建MyAsyncTask类
//-===============================
Http
public static String requestHttpGet(String strUrl) {
try { //设置url
URL url = new URL(strUrl);
//获取HttpURLConnection
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//设置为get请求
connection.setRequestMethod("GET");
//设置连接主机超时时间
connection.setConnectTimeout(5000);
//设置从主机读取数据超时
connection.setReadTimeout(5000);
//获取请求码(来判断网络请求是否正确)
int code = connection.getResponseCode();
//判断请求是否成功
if (code == HttpURLConnection.HTTP_OK) {
//如果数据请求成功
//就获取数据
InputStream stream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "utf-8"));
//拼接字符串
StringBuilder builder = new StringBuilder();
//把数据读取从成字符串
String str = "";
while ((str = reader.readLine()) != null) {
//把一行行数据拼接成一行数据
builder.append(str);
}
//返回拼接后的数据
return builder.toString();
}
//关闭连接
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
3.MyAsyncTask代码如下
public class MyAsyncTask extends AsyncTask< String,Integer,String> {
@Override
protected String doInBackground(String... strings) {
//代表子线程
//第五步:利用子线程请求数据
return Http.requestHttpGet(strings[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//主线程
//5调用
mCallbackS.getData(s);
}
//第六步:接口回调=================第七部/:进入MainActivity
//1创建接口
public interface CallBackS{
//2抽象方法
void getData(String str);
}
//3写个属性
private CallBackS mCallbackS;
//4写一个set方法
public void setmCallbackS(CallBackS mCallbackS) {
this.mCallbackS = mCallbackS;
}
}
4.点击事件下方写接口注册对象实现getData接口
MyAsyncTask task = new MyAsyncTask();
//第九部:6 注册接口
task.setmCallbackS(MainActivity.this);
//第十步: 请求数据(参数 : 接口 )
task.execute("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");
//这个时候开始请求数据,数据请求完成后会返回返回到接口回调的方法中
break;
5.实现接口得到接口回调返回的数据-
@Override
public void getData(String str) {
//第十一步:实现接口MyAsyncTask.CallBackS ,得到getData方法
//第十二步:得到接口回调返回的数据-->str
//第十三步:解析
Gson gson = new Gson();
JsonBean jsonBean = gson.fromJson(str, JsonBean.class);
//获取集合
ArrayList<JsonBean.DataBean> data = jsonBean.getData();
//第十四步:设置适配器
listView.setAdapter(new MyAdapter(data, MainActivity.this));
}
适配器代码如下
ublic class MyAdapter extends BaseAdapter {
private ArrayList<JsonBean.DataBean> list;
private Context context;
public MyAdapter(ArrayList<JsonBean.DataBean> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = View.inflate(context, R.layout.item, null);
ImageView imageView = convertView.findViewById(R.id.imageView);
TextView textView = convertView.findViewById(R.id.textView);
JsonBean.DataBean datas = list.get(position);
textView.setText(datas.getNews_title());
//第十五步 请求图片
//请求图片需要在Application中注册
///在你自己的项目中 build.gradle( : 你项目的名字)
// implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
//然后新建一个App的类
String uri = datas.getPic_url();
///第十九部:请求图片(参数:1.图片接口 ,2 imageview的控件)
ImageLoader.getInstance().displayImage(uri, imageView);
//完成
//注意 网络权限
return convertView;
《**这一部分是优化代码,可忽略
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder vh;
if(view==null){
view=LayoutInflater.from(con).inflate(R.layout.item,null);
vh=new ViewHolder();
vh.name=view.findViewById(R.id.name);
vh.img=view.findViewById(R.id.image);
view.setTag(vh);
}else{
vh= (ViewHolder) view.getTag();
}
vh.name.setText(arr.get(i).getNews_title());
//第十五步 请求图片
//请求图片需要在Application中注册
///在你自己的项目中 build.gradle( : 你项目的名字)
// implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
//然后新建一个App的类
String url = arr.get(i).getPic_url();
//第十九部:请求图片(参数:1.图片接口 ,2 imageview的控件)
ImageLoader.getInstance().displayImage(url,vh.img);
//完成
//注意 网络权限
return view;
}
static class ViewHolder{
TextView name;
ImageView img;
}
}
}
6.app在下方
package com.qy.day02.app;
import android.app.Application;
import android.graphics.Bitmap;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.qy.day02.R;
//第十六部:创建自己的Application,然后继承Application
public class App extends Application {
//第十七部:注册 Application
@Override
public void onCreate() {
super.onCreate();
//第十八部:设置框架的一些属性,然后初始化 ImageLoader
DisplayImageOptions options = new DisplayImageOptions.Builder()
// 正在加载时显示的占位图
.showImageOnLoading(R.mipmap.zhan)
// // URL为空时显示的占位图
// .showImageForEmptyUri(R.mipmap.zhaobudao)
// 加载失败时显示的占位图
.showImageOnFail(R.mipmap.shibai)
// //可在实现中对 bitmap 做一些额外处理,比如加圆角、动画效果。
// .displayer(new SimpleBitmapDisplayer())
// bitmap的质量,默认为ARGB_8888
.bitmapConfig(Bitmap.Config.ARGB_8888)
.build();
//1构建
ImageLoaderConfiguration loaderConfiguration = new ImageLoaderConfiguration.Builder(this)
//把我们写的设置添加到构建中
.defaultDisplayImageOptions(options)
//构建
.build();
//获得实例
ImageLoader imageLoader = ImageLoader.getInstance();
//初始化
imageLoader.init(loaderConfiguration);
//初始化完成后进入适配器加载图片
}
}
| | |
|--|--|
| | |
提示
要在该项目build.gradle里后方复制一下代码
implementation ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’
还有App一定要注册