Httpurlconnection进行网络请求+ListView

Httpurlconnection进行网络请求+ListView**

  1. 第一步:找控件设置值监听在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一定要注册

猜你喜欢

转载自blog.csdn.net/qq_40432465/article/details/85331427