在活动开始之前在ImageView中加载位图

时间:2017-06-18 09:57:30

标签: android bitmap bitmapfactory

我让我的用户从他们的图库中选择一个背景,然后将其保存到内部存储器中:

当用户选择背景时:

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中加载背景(所以我看不到半秒的黑色背景)。

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

2 个答案:

答案 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