Android 活动开始前在ImageView中加载位图
我让我的用户从他们的图库中选择背景,并将其保存到内存中: 当用户选择背景时:Android 活动开始前在ImageView中加载位图,android,bitmap,bitmapfactory,Android,Bitmap,Bitmapfactory,我让我的用户从他们的图库中选择背景,并将其保存到内存中: 当用户选择背景时: new ImageBackground(getApplicationContext()).save(MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData())); 保存图像: private void saveImageToFile(Bitmap bitmapImage){ Fi
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,毕加索和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中加载背景(因此我在半秒钟内看不到黑色背景)
我怎样才能做到这一点?或者我现在可以这样做吗?使用启用缓存的毕加索/Glide,这样它会尽快加载您的图像:)不建议使用AsyncTask
Picasso.with(context)
.load(imageUrl)
.into(imageView);
毕加索将为您进行自动缓存:)
我经常读到,最好使用ASync或Glide/Picasso加载
建议这样做,因为图像加载是一项昂贵的任务。如果在主线程上执行,它将阻止应用程序。换句话说,应用程序将对用户没有响应,因为线程将忙于加载图像。所以这是加载图像的“正确方法”。此外,最好使用适当的库来加载图像,而不仅仅是异步任务
imageView在开始时为黑色,因为图像尚未加载。要解决此问题,可以使用占位符图像,该图像将显示在imageView中,直到加载实际图像
毕加索支持下载和错误占位符作为可选功能
Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
有关更多信息,请参阅。缓存的作用是什么?是否在向用户显示活动之前加载图像?如果图像显示在上一个活动中,库会将其保留在缓存中,以便在下一个活动中几乎立即加载。别想得太多,把它留给图书馆吧。他们会处理好的。只要使用毕加索加载你的图像,毕加索就会为你完成其余的工作:)毕加索。使用(上下文)。加载(url)。导入(图像视图);嗯,我已经试过了,但是我对结果不满意,因为我在开始时仍然看到黑色背景。我真的希望它在用户看到活动之前就已经加载。因为您的imageView位于活动内部,所以在活动本身准备就绪之前,您不能加载图像。谢谢您的反应。但是通过这个解决方案,我得到了另一张图片,在半秒钟后,我看到了正确的图片。我希望在用户看到活动之前显示正确的图像。@tomhogenkamp有时图像太大,需要时间加载。。这就是为什么我们使用占位符(通常尺寸较小)来代替它,直到图像加载完成。。或者,在图像加载之前,您可以使用不确定的进度条,但不能在活动开始之前将图像加载到活动中。