我让我的用户从他们的图库中选择一个背景,然后将其保存到内部存储器中:
当用户选择背景时:
new ImageBackground(getApplicationContext()).save(MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData()));
保存图片:
private void saveImageToFile(Bitmap bitmapImage){
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(createFile());
bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private File createFile() {
File directory = context.getDir(DIRECTORY_NAME, Context.MODE_PRIVATE);
return new File(directory, FILENAME);
}
所以此时我的图像被保存到内部存储器中。现在,当用户启动应用程序时,此图像应加载到ImageView中。我使用ASync,Picasso和Glide来做到这一点,这很好但是工作正常;当我使用这些方法时,在启动应用程序时,开头的背景总是黑色(默认背景)半秒钟。
我现在正在做的是使用下面的代码。这个现在工作正常,但我总是读到最好用ASync或Glide / Picasso加载。
private Bitmap getImageBackground(){
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(createFile());
return BitmapFactory.decodeStream(inputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//Default background
return BitmapFactory.decodeResource(context.getResources(), R.drawable.background);
}
所以我想要的;当向用户显示活动时,应该在ImageView中加载背景(所以我看不到半秒的黑色背景)。
我怎样才能做到这一点?或者我现在怎么做?
答案 0 :(得分:0)
使用Picasso / Glide并启用缓存,以便尽快加载图像:)不建议使用AsyncTask。
Picasso.with(context)
.load(imageUrl)
.into(imageView);
Picasso会为你做自动缓存:)
答案 1 :(得分:0)
我一直认为最好使用ASync或Glide / Picasso加载。
建议这样做是因为图像加载是一项昂贵的任务。如果在主线程上完成,它将阻止应用程序。换句话说,由于线程将忙于加载图像,因此应用程序将对用户无响应。所以这是加载图像的“正确方法”。另外,最好使用适当的库来进行图像加载,而不仅仅是AsyncTask。
imageView在开始时是黑色的,因为尚未加载图像。为了解决这个问题,您可以使用占位符图像,该图像将显示在imageView中,直到加载实际图像为止。
Picasso支持下载和错误占位符作为可选功能。
Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
有关详细信息,请参阅this。