【问题标题】:Out of memory on a 10171204-byte allocation in android appandroid 应用程序中的 10171204 字节分配内存不足
【发布时间】:2011-11-14 15:12:57
【问题描述】:

在我的应用程序中,我试图通过单击按钮下载一些视频。我在通知区域显示一个进度条,我已经问过一个关于这个here的问题(它在赏金中)

现在为了解决我的问题,我将代码更改为如下,当单击第一个按钮时,它会在通知中启动一个进度条,由 UploadService 类扩展 IntentService 并显示进度条

当第二个按钮被点击时,它会尝试通过 UploadService2 扩展 IntentService 类在通知中启动另一个进度条,但应用程序立即崩溃并显示以下错误

E/dalvikvm-heap( 2325): Out of memory on a 10171204-byte allocation.
E/AndroidRuntime( 2325): Uncaught handler: thread IntentService[UploadService2] exiting due to uncaught exception
E/AndroidRuntime( 2325): java.lang.OutOfMemoryError
E/AndroidRuntime( 2325):        at uk.me.hardill.android.notification.UploadService2$1.run(UploadService2.java:93)
E/AndroidRuntime( 2325):        at uk.me.hardill.android.notification.UploadService2.onHandleIntent(UploadService2.java:134)
E/AndroidRuntime( 2325):        at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:30)
E/AndroidRuntime( 2325):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2325):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2325):        at android.os.HandlerThread.run(HandlerThread.java:60)

我的 UploadServices 类是 here

【问题讨论】:

    标签: android download out-of-memory


    【解决方案1】:

    鉴于您仅在这段代码中使用缓冲区:

    byte[] buffer = new byte[10171188];
    int len1 = 0;
    while ((len1 = is.read(buffer)) != -1) 
    {
        fos.write(buffer, 0, len1);
    }
    

    答案似乎很简单:使用较小的缓冲区。即使在台式机上,我通常也会创建一个大约 32K 的缓冲区 - 在 移动 设备上创建一个 10M 的缓冲区在 IMO 上是一个非常糟糕的主意。

    即使您可以填充该缓冲区,也没有必要拥有那么大的缓冲区 - 而且由于您实际上正在获取网络资源,因此即使 1% 的缓冲区也不太可能将在一次读取中填充。

    【讨论】:

    • 那么要提到多少缓冲区?
    • @SivaK:8K? 32K可能吗?我当然不会超过这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多