0

次のコードを使用して、URLからビットマップを取得しています。この関数は私のコードで複数回使用されており、3回目または4回目の呼び出しでクラッシュして次のエラーが表示されます。URLが存在し、以前の呼び出しに違いはないと確信しています。ありがとうございました

 public static Bitmap getBitmapFromURL(String src) {
                try {
                    Log.e("src",src);
                    URL url = new URL(src);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setDoInput(true);
                    connection.connect();
                    InputStream input = connection.getInputStream();
                    Bitmap myBitmap = BitmapFactory.decodeStream(input); //crashes at this line
                    Log.e("Bitmap","returned");
                    return myBitmap;
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.e("Exception",e.getMessage());
                    return null;
                }
            }

06-15 14:15:34.365: E/AndroidRuntime(863): FATAL EXCEPTION: main
06-15 14:15:34.365: E/AndroidRuntime(863): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
06-15 14:15:34.365: E/AndroidRuntime(863):  at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
06-15 14:15:34.365: E/AndroidRuntime(863):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459)
06-15 14:15:34.365: E/AndroidRuntime(863):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:515)
06-15 14:15:34.365: E/AndroidRuntime(863):  at com.nimbosolutions.projecte1.TabBar_iOSActivity.getBitmapFromURL(TabBar_iOSActivity.java:232)
06-15 14:15:34.365: E/AndroidRuntime(863):  at com.nimbosolutions.projecte1.TabBar_iOSActivity.addTab(TabBar_iOSActivity.java:209)
4

1 に答える 1

0

「3回目または4回目」とおっしゃいましたが、毎回同じビットマップですか?はいの場合、キャッシュして再利用してみませんか?

いいえの場合、メモリ内の3〜4ビットビットすべてを同時に必要としますか?はいの場合、あなたはすり減っています。recycle()そうでない場合は、ビットマップを破棄する前に(つまり、参照をnullにする前に)、ビットマップを呼び出すことをお勧めしますか?これは、バニラGCよりも速くメモリを解放することが知られています。

于 2012-06-15T14:25:46.557 に答える