【问题标题】:asynchronous image loading and the android canvas异步图像加载和 android 画布
【发布时间】:2010-08-02 14:15:42
【问题描述】:

我目前正在开发一个使用可滚动/可缩放图像作为主要用户界面的程序。它使用由矩阵操纵的画布来遍历大面积区域。我不想将超大位图加载到内存中,而是想使用平铺系统来加载 256 x 256 的正方形。我的问题是当图像被加载到内存中时应用程序会滞后。我使用简单的外部和内部 for 循环来加载图块(如果它们为空),并且如果用户缩小到一定程度,图块全部消失并显示整个图像的较低分辨率版本。我被引导到异步图像加载的方向,这似乎可以防止图像加载到内存时的延迟,但我不知道如何开始,并且想知道是否有人对如何通常异步加载位图有任何建议进入画布。谢谢!

【问题讨论】:

    标签: android image asynchronous canvas bitmap


    【解决方案1】:

    我只是使用第二个线程来执行任何可能需要一些时间来确保 UI 始终良好且响应迅速的事情。如果 UI 包含动画(如滚动)以消除卡顿,您甚至可能希望降低该线程的优先级。

    您可以使用第二个 Thread 对象,该对象在完成后通过 Handler 发送消息,或者您可以使用 AsyncTask。

    【讨论】:

    • 我会调查这两个,谢谢。一旦我有异步任务将我的位图加载到内存中并在完成后将它们加载到我的 UI 中,回收位图以避免内存不足错误的最有效方法是什么?另一个检查不再查看位图的异步任务?
    • Bitmap.recycle() 快速杀死它们。除此之外,最重要的事情是确保您不再持有对它们的引用。对静态成员要格外小心,并确保将它们从您拥有的任何数组/列表中删除 - 包括指向指向这些位图的可绘制对象的视图数组:)
    • 太棒了,非常感谢。要使用 bitmap.recycle(),检测是否不再查看位图的最佳方法是拥有一个记录正在绘制哪些位图的数组,然后有一个 for 循环遍历每个位图以查看是否不等于那些价值观?它是我现在所拥有的,似乎应该有一种更简单的方法来确定在屏幕上绘制哪些位图。
    • 取决于 - 谁在管理您的视图?如果它在画廊之类的地方,我会让视图为您处理它:确保您没有对任何视图进行任何引用,并确保除了视图之外没有人引用位图本身。这样,一旦操作系统放弃了视图,如果内存不足,位图也会消失。这是一般的答案——除此之外的任何事情都需要了解您的系统是如何设置的。
    • 谢谢。实际上,我只有一个自定义视图,其中包含在校园中绘制的位图。我将首先获得异步任务以正确加载我的位图,然后解决任何内存问题。谢谢你的一切。
    猜你喜欢
    • 2019-12-30
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多