从网站加载图片时如何减少内存?

时间:2012-07-12 07:35:04

标签: memory blackberry

我正在使用此实用程序

public class Util_ImageLoader {
public static Bitmap _bmap;

Util_ImageLoader(String url) {
    HttpConnection connection = null;
    InputStream inputStream = null;
    EncodedImage bitmap;
    byte[] dataArray = null;

    try {
        connection = (HttpConnection) Connector.open(url + Util_GetInternet.getConnParam(), Connector.READ,
                true);
        inputStream = connection.openInputStream();
        byte[] responseData = new byte[10000];
        int length = 0;
        StringBuffer rawResponse = new StringBuffer();
        while (-1 != (length = inputStream.read(responseData))) {
            rawResponse.append(new String(responseData, 0, length));
        }
        int responseCode = connection.getResponseCode();
        if (responseCode != HttpConnection.HTTP_OK) {
            throw new IOException("HTTP response code: " + responseCode);
        }

        final String result = rawResponse.toString();
        dataArray = result.getBytes();
    } catch (final Exception ex) {
    }

    finally {
        try {
            inputStream.close();
            inputStream = null;
            connection.close();
            connection = null;
        } catch (Exception e) {
        }
    }

    bitmap = EncodedImage
            .createEncodedImage(dataArray, 0, dataArray.length);
    int multH;
    int multW;
    int currHeight = bitmap.getHeight();
    int currWidth = bitmap.getWidth();
    multH = Fixed32.div(Fixed32.toFP(currHeight), Fixed32.toFP(currHeight));// height
    multW = Fixed32.div(Fixed32.toFP(currWidth), Fixed32.toFP(currWidth));// width
    bitmap = bitmap.scaleImage32(multW, multH);

    _bmap = bitmap.getBitmap();
}

public Bitmap getbitmap() {
    return _bmap;
}
}

当我在包含10个孩子的listfield中调用它时,日志会一直说failed to allocate timer 0: no slots left

这意味着内存正在耗尽,没有更多内存可以再次分配,因此我的主屏幕无法启动。

1 个答案:

答案 0 :(得分:2)

同时在内存中有以下对象:

    // A buffer of about 10KB
    byte[] responseData = new byte[10000];

    // A string buffer which will grow up to the total response size
    rawResponse.append(new String(responseData, 0, length));

    // Another string the same length that string buffer
    final String result = rawResponse.toString();

    // Now another buffer the same size of the response.        
    dataArray = result.getBytes();

总而言之,如果你下载了n个ascii字符,你在第一个unicode字符串缓冲区中同时有10KB,加上2 * n个字节,加上result字符串中的2 * n个字节,加上{{中的n个字节1}}。如果我没错,那总计可达5n + 10k。还有优化的空间。

一些改进将是:

  • 首先检查响应代码,然后在响应代码为HTTP 200时读取流。如果服务器返回错误,则无需读取。
  • 摆脱字符串。如果之后再次转换为字节,则无需转换为字符串。
  • 如果图像很大,请不要在下载时将它们存储在RAM中。相反,打开dataArray并在从输入流中读取时写入临时文件。然后,如果临时图像仍然足够大以显示,请缩小它们。