先上效果
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();
}
}