如何在 Android 中使位图加载更快?
Posted
技术标签:
【中文标题】如何在 Android 中使位图加载更快?【英文标题】:How to make bitmap loading faster in Android? 【发布时间】:2021-08-29 03:00:21 【问题描述】:我有一个代码可以加载图像的缩略图并将其提供给滑行。然后滑翔将加载到支架中。但是,当我加载缩略图时,它会返回一个位图。所以,我将位图传递给滑行。但是,初始加载需要将近 30 秒。我的意思是在画廊里有很多照片。因此,当画廊打开时,它根本不会显示 30 秒的图像。然后它会显示位图。
另一方面,如果我使用 URI 来馈送滑行,它会立即加载它。但是,图像正在回收站视图中加载。因此,当时只会加载一些图像。
加载一些图像后。当我们向上滑动并查看其他照片的加载速度时,显然位图馈送图像的加载速度比 URI 馈送图像更快。但是,位图需要 30 秒的初始加载时间。
有什么方法可以让这个位图加载更快?
...
while (cursor.moveToNext())
Log.d("FetchImages(): ", " Started");
Bitmap thumbBitmap = null;
int _thumpId = cursor.getInt(column_index_data);
Uri uri1 = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, _thumpId);
Size thumbSize = new Size(150, 150);
try
thumbBitmap = getApplicationContext().getContentResolver().loadThumbnail(uri1, thumbSize, null);
catch (IOException e) e.printStackTrace();
ImageModel ImageModel = new ImageModel();
ImageModel.setBitmap(thumbBitmap);
arrayList.add(ImageModel);
Log.d("FetchImages(): ", " Ended");
runOnUiThread(() ->
Adapter Adapter = new Adapter(getApplicationContext(), arrayList, MainActivity.this);
recyclerView.setAdapter(Adapter);
cursor.close();
Log.d("FetchImages(): ", " RecyclerView Adapter attached");
);
...
【问题讨论】:
【参考方案1】:Glide .with(context) .load(url).apply(new RequestOptions().override(150, 150)) //for resizing .into(imageView);
不需要创建位图它需要更多的计算。 Glide 更快更高效。 如果你想使用位图,那么使用 AsycTask 这样它就不会阻塞主线程并且程序不会挂起。
【讨论】:
没有冻结。它只是没有加载到 recyclerview 大约 30 秒。那时的 UI 是完全流畅且反应灵敏的。我正在尝试获取位图,因为不推荐使用MediaStore.Images.Thumbnails.DATA
。因此,要生成缩略图,我们必须使用loadThumbnails()
方法。返回Bitmap
。而且AsyncTask()
也被弃用了。所以,位图加载是必要的。
您不需要使用上面的代码加载缩略图,您将生成精确大小的缩略图 150×150。
对于位图,请尝试将 android:largeHeap=true 添加到清单中,以便您有内存可以使用以上是关于如何在 Android 中使位图加载更快?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SkiaSharp 中使 SKBitmap 位图颜色为透明
Android:如何在不加载完整位图的情况下将流式图像即时渲染到 ImageView?