我正在为我的应用建立个人资料页面。我这样做的方式是,点击上一个个人资料图像,用户将能够更改其个人资料图片。我希望上传后,个人资料图片会立即更新。我尝试过使用毕加索(Picasso),但缓存似乎有一些问题。实际上,在用户选择了他的图像之后,尽管该应用程序会覆盖先前的图像文件并重新应用毕加索,但所显示的图片与之前的图片相同。我正在使用Android API 22。

Profile.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.profile);

    ImageView pic = (ImageView) findViewById(R.id.picc);


        ...

        String root = Environment.getExternalStorageDirectory().toString();
        String path = root + "/directory/name.jpg";

        MainActivity.trimCache(this);
        Picasso.with(getApplicationContext()).load(path)
                    .networkPolicy(NetworkPolicy.NO_CACHE)
                    .memoryPolicy(MemoryPolicy.NO_CACHE)
                .transform(new RoundedTransformation(1000, 0))
                    .resize(500, 500)
                    .centerCrop()
                .into(pic);
    }



    pic.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent chooseImageIntent = ImagePicker.getPickImageIntent(getApplicationContext());
            startActivityForResult(chooseImageIntent, PICK_IMAGE_ID);
        }
    });

}




    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

            Bitmap bitmap = ImagePicker.getImageFromResult(this, resultCode, data);

            ImageView pic = (ImageView) findViewById(R.id.picc);

            RetrieveFeedTask job = new RetrieveFeedTask(data, resultCode, this, bitmap);
            job.execute("user","pass");

            String root = Environment.getExternalStorageDirectory().toString();
            String path = root + "/directory/name.jpg";
            MainActivity.trimCache(this);
            Picasso.with(getApplicationContext()).load(path)
                    .networkPolicy(NetworkPolicy.NO_CACHE)
                    .memoryPolicy(MemoryPolicy.NO_CACHE)
                    .transform(new RoundedTransformation(1000, 0))
                    .resize(500, 500)
                    .centerCrop()
                    .into(pic);
    }


ImagePicker.java是标准的图像选择器文件。

我也尝试使用以下功能从应用程序中删除缓存

public static void trimCache(Context context) {
    try {
        File dir = context.getCacheDir();
        if (dir != null && dir.isDirectory()) {
            deleteDir(dir);
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}

最佳答案

默认情况下,毕加索实例拥有一个内存缓存。毕加索为缓存看到相同的密钥(在本例中为path),只是简单地从该密钥获取的缓存中返回Bitmap实例。

您可以使用memoryPolicy(MemoryPolicy.NO_CACHE)正确地跳过缓存检查;您确定更改/更新之后就是这种调用图像的方式吗?

08-17 01:47