Android recyclerview+HttpURLconnection+Gson+handler 加载网络图片

先上效果

https://www.bilibili.com/video/av69927311/

gitHub地址https://github.com/yukaida/onlinePicture/wiki

参考了视频教程https://www.bilibili.com/video/av69068836

思路:点击Button通过HttpURlconnection获取到Json数据后,用Gson解析为java对象,每一张图片的信息储存在ReciveData的内部类photoData中,图片信息数组储存在list result中,在recyclerView适配器的onBindViewHolder方法中每次获取到待加载的子项位置后通过方法的position参数获取对应的图片信息参数,再次通过HttpURLconnection从图片url中获取图片的输入流信息,用BitMapFactory转换为Bitmap对象返回给holder并绑定.完成后通过handler通知recyclerview刷新界面

引入需要用到的依赖包 recyclerview+Gson

implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.google.code.gson:gson:2.8.5'

用到的api接口地址 https://api.apiopen.top/getImages?page=0&count=10打开后返回的数据信息如下

用json解析工具解析之后得到清晰的json结构

新建ReciveData用于映射json数据

package com.example.onlinepicture;

import java.util.ArrayList;
import java.util.List;

public class ReciveData {
    public int code;
    public String message;

    public List<photoData> result ;

    public class photoData {
        public int id;
        public String time;
        public String img;
    }

}

MainActivity

package com.example.onlinepicture;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private Button button;
    private RecyclerView recyclerView;

    private List<ReciveData.photoData> photolist = new ArrayList<>();//图片信息数组
    private ReciveData reciveData;//Json映射的java对象

    MyAdapter myAdapter = new MyAdapter(photolist);
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            myAdapter.notifyDataSetChanged();//完成数据装载后从子线程中获取完成通知,告知recyclerview刷新数据
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.recyclerView);

        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                WithHttpURLConncetion();//获取json数据并解析
            }
        });


        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        recyclerView.setAdapter(myAdapter);
    }

    private void WithHttpURLConncetion() {

        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                InputStream inputStream = null;
                try {
                    URL url = new URL("https://api.apiopen.top/getImages?page=0&count=10");//api地址
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setReadTimeout(8000);
                    connection.setRequestMethod("GET");//设置请求方法
                    inputStream = connection.getInputStream();//获取输入流
                    String data = readInputStream(inputStream);//将输入流转换为String类型的json数据

                    reciveData = new Gson().fromJson(data, ReciveData.class);//将得到的json数据映射为Gson对象,并将对应java对象的指针指向该对象
                    photolist.addAll(reciveData.result);//将完整数据对象ReciveData中的图片信息数组复制给MainActivity中的全局数组用于传递给适配器

                    Message message = new Message();
                    handler.sendMessage(message);//完成数据获取解析转换传递之后给handler发从完成通知,通知recyclerview刷新数据
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (inputStream != null) {
                        try {
                            inputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (connection != null) {
                        connection.disconnect();
//如果输入流不为空 连接有效 数据获取完毕 则关闭输入流和连接 释放资源
                    }
                }
            }
        }).start();


    }
//转换输入流为String类型的Json数据
    private String readInputStream(InputStream inputStream) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String line = null;
        StringBuilder stringBuilder = new StringBuilder();
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line);
        }
        String data_return = stringBuilder.toString();
        return data_return;
    }

}

Adapter 

package com.example.onlinepicture;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    List<ReciveData.photoData> list;//图片信息数组

    public MyAdapter(List list) {
        this.list = list;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;
        ImageView imageView;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.item_textView);
            imageView = itemView.findViewById(R.id.item_imageView);
        }
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, null);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.textView.setText(list.get(position).time);
        markBitmap(list.get(position).img, holder.imageView);//将图片传递给子项holder,
        // 第一个参数为数组中的图片url,第二个参数为需要被传递图片信息的imageView实例

        }


    @Override
    public int getItemCount() {
        return list.size();
    }

    // 第一个参数为数组中的图片url,第二个参数为需要被传递图片信息的imageView实例
    private void markBitmap(final String image_url, final ImageView imageView) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                InputStream inputStream = null;

                try {
                    URL url = new URL(image_url);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setReadTimeout(8000);
                    connection.setConnectTimeout(8000);
                    connection.setRequestMethod("GET");

                    inputStream = connection.getInputStream();
                    //获取图片信息输入流
                    final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                    //将输入流转换为bitmap对象
                    imageView.post(new Runnable() {
                        @Override
                        public void run() {
                            imageView.setImageBitmap(bitmap);
                            //通过imageView的post方法切换到主线程将bitmap对象设置进去
                        }
                    });

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();


    }
}
发布了39 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_29478763/article/details/102011578