【问题标题】:Loading Bitmap in ImageView before Activity started在 Activity 开始之前在 ImageView 中加载位图
【发布时间】:2017-06-18 09:57:29
【问题描述】:

我让我的用户从他们的图库中选择一个背景并将其保存到内存中:

当用户选择背景时:

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);
}

所以我想要什么;当向用户显示 Activity 时,应该在 ImageView 中加载背景(所以我在半秒钟内看不到黑色背景)。

我怎样才能做到这一点?或者我现在怎么做可以吗?

【问题讨论】:

    标签: android bitmap bitmapfactory


    【解决方案1】:

    我一直读到最好使用 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 了解更多信息。

    【讨论】:

    • 感谢您的反应。但是通过这个解决方案,我首先显示了另一个图像,半秒后就像是正确的图像。我希望在用户看到活动之前显示正确的图像。
    • @tomhogenkamp 有时图像太大以至于需要时间来加载。这就是为什么我们使用占位符(通常尺寸较小)来代替它,直到图像完成加载。或者在加载图像之前,您可以使用不确定的进度条,但不能在图像开始之前将其加载到活动中。
    【解决方案2】:

    在启用缓存的情况下使用 Picasso/Glide,以便它尽快加载您的图像 :) 不太推荐使用 AsyncTask。

    Picasso.with(context)
        .load(imageUrl)
        .into(imageView);
    

    毕加索会为你做自动缓存:)

    【讨论】:

    • 缓存有什么作用?它会在活动显示给用户之前加载图像吗?
    • 如果图像显示在上一个活动中,则库会将其保存在缓存中,以便几乎立即在下一个活动中加载。别想太多,留给图书馆吧。他们会照顾好它。
    • 只需使用 picasso 加载您的图片,picasso 将为您完成剩下的工作 :) Picasso.with(context) .load(url) .into(imageView);
    • 嗯,我已经试过了,但我对结果并不满意,因为我在开始时仍然看到黑色背景。我真的希望在用户看到 Activity 之前已经加载它。
    • 由于您的 imageView 位于 Activity 内部,因此您无法在 Activity 本身准备好之前加载图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2012-02-16
    • 2017-02-15
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多