android - 在 HashMap 中保存字节数组时出错
问题描述
在我的应用程序中,我正在使用 Retrofit 请求获取字节数组。然后我需要将此字节 [] 保存在 HashMap 中,然后使用 Glide 加载。好的,这是我的代码。
public class SimpleClass extends AppCompatActivity {
private Activity activity = SimpleClass.this;
private ImageView imageView;
private HashMap<String, byte[]> imageHashMap;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getImageBytes("Image1");
}
public void getImageBytes(final String imageName) {
Call<ResponseBody> getChatImage = retrofitClient.getImagesBytes(imageName);
getChatImage.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()) {
try {
imageHashMap.put("Key1", response.body().bytes());
Glide.with(activity).load(response.body().bytes()).fitCenter().into(imageView);
} catch (Exception e) {
Toast.makeText(activity, "Error cought in catch block: " + e.toString(), Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
} else {
Toast.makeText(activity, "Response is not successful: " + response.errorBody(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(activity, "An error occurred", Toast.LENGTH_SHORT).show();
}
});
}
}
因此,当我想将 byte[] 放入 HashMap 时,我在 catch 块中遇到了这样的错误 - java.io.IOException: Content-Length (25139) and stream length (0) disagree
。所以当我删除这条线 -imageHashMap.put("Key1", response.body().bytes());
时,一切正常。那么为什么我不能将 byte[] 放入 HashMap 中呢?是的,还有一个问题。使用什么比较好:HashMap 或 LinkedHashMap?
解决方案
byte[](或任何数组)不能作为 HashMap 中的键正常工作,因为数组不会覆盖 equals,因此只有两个数组引用同一个对象时才会被视为相等。
您必须将 byte[] 包装在一些覆盖 hashCode 和 equals 的自定义类中,并将该自定义类用作 HashMap 的键。
推荐阅读
- ios - UIPickerView 不显示数组中的数据
- matlab - 在 matlab 中使用 perfcurve 和 SVM (fitcsvm) 的 ROC 和 AUC
- php - 无法使用 phpmailer 更新数据库中的密码
- sql-server - 创建函数 SQL-Server 语法不正确
- react-native - 如何在不使用 App.js 的情况下将像 Login.js 这样的单个页面加载为主页
- google-compute-engine - 如何使用 Terraform 脚本在 GCP 中的 LINUX(Ubuntu/Debian)GCE 实例中安装 stackdriver?
- javascript - 在将其作为数据发送到控制器之前从 ajax 中的 html 正文中删除 html 元素
- unity3d - 不同的场景集或动态变化的 UI?
- javascript - 在本机 JS 中使用 .map 保留对象键
- javascript - Firebase:查询未知名称键中的数据(另一个孩子中的孩子)