現在作成している電子書籍のアプリで、タブレットでは堕ちないのにAndroidケータイ(しかもNexusS)で実行すると
Out of Memoryで堕ちるという現象にここ最近ずっと悩まされてた。
画像をたくさん扱うんでBitmap系のエラーかとおもい、
SoftReference使ってみたんだが特に変わり無し。
ddmsツールでメモリーアロケーション見てみたら
17MBと確かに大分ヤバい感じ。
…まぁここで気づくべきだったんだが、OOMエラーが出てる箇所は決まってファイルコピーの所だった。
ただ、最初はイメージファイルのコピーだと思ってたんで17MBも使用するはずは無いと思ってた。
で、デバグで何のファイルをコピーしてるか見てみたら
画像のzipファイルをコピーしてやがったw→22MBくらいあるw
で、従来一気に読み込んでコピーしている所、
InputStream is = context.getResources().getAssets().open(src);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] byteArray = new byte[bis.available()];
bis.read(byteArray);
をストリーミング形式で読むように変更。
InputStream is = context.getResources().getAssets().open(src);
BufferedInputStream bis = new BufferedInputStream(is);
FileOutputStream fos = new FileOutputStream(destFile);
byte[] byteArray = new byte[BUFFER_SIZE];
int actual = 0;
while ((actual = bis.read(byteArray, 0, BUFFER_SIZE)) > 0) {
fos.write(byteArray, 0, actual);
}
こうする事でようやくOOMエラーが無くなった。
更にファイルが存在する場合はコピーしないようにしてデバグ終了。
あーすっきりしたw
posted by 1.618 at 19:38|
Comment(0)
|
Android
|

|