Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 活动开始前在ImageView中加载位图_Android_Bitmap_Bitmapfactory - Fatal编程技术网

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有时图像太大,需要时间加载。。这就是为什么我们使用占位符(通常尺寸较小)来代替它,直到图像加载完成。。或者,在图像加载之前,您可以使用不确定的进度条,但不能在活动开始之前将图像加载到活动中。