首页 > 解决方案 > 在 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?

标签: androidarrayshashmapretrofitandroid-glide

解决方案


byte[](或任何数组)不能作为 HashMap 中的键正常工作,因为数组不会覆盖 equals,因此只有两个数组引用同一个对象时才会被视为相等。

您必须将 byte[] 包装在一些覆盖 hashCode 和 equals 的自定义类中,并将该自定义类用作 HashMap 的键。


推荐阅读