我正在为我的应用建立个人资料页面。我这样做的方式是,点击上一个个人资料图像,用户将能够更改其个人资料图片。我希望上传后,个人资料图片会立即更新。我尝试过使用毕加索(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)
正确地跳过缓存检查;您确定更改/更新之后就是这种调用图像的方式吗?