2016-06-26 4 views
0

私は画像を保存したいのですが、画像を保存するためにsqlite DataBaseを使用しています。私は10〜12枚の画像を入れたときにコードがうまく動作しますが、その後OutOfMemoryErrorが表示されます。私はアンドロイドを使用します:largeHeap = "true"それはメモリのいくつかの量を増加させるが、これは私のwork.howのために十分ではない?OutOfMemoryError:OWまで482112の空きバイトと470KBの3686412バイト割り当てを割り当てられませんでしたか?

これは私のコードです:イメージが非常に大きい場合

if(data==null){ 
        Uri uri = data.getData(); 


        try { 

         InputStream inputStream = getContentResolver().openInputStream(uri); 
         BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); 
         Bitmap bmp = BitmapFactory.decodeStream(bufferedInputStream); 

         ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
         bmp.compress(Bitmap.CompressFormat.PNG, 100, bos); 
         byte[] bArray = bos.toByteArray(); 

         DataBase dataBase=new DataBase(getBaseContext()); 
         dataBase.insertImage(bArray); 
         Toast.makeText(getBaseContext(),"single item ",Toast.LENGTH_LONG).show(); 
        } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
        } 
+0

イメージをメモリに保存し、パスのみをsqliteに保存します。 – Sharj

+0

ファイル内の@Sharj u meanですか? –

答えて

1

これが起こります。 Jpgでペイントしてイメージを保存し、このようにサイズを縮小することができます。それらの1つが機能するまで、異なる次元で試してみてください。

+0

ここは間違いなく良い点です。 "(Apple)Retinaのディスプレイには、あなたのイメージが"見栄えが良い "ことを確認してください。間違いなく、特にあなたがハガキよりも小さいディスプレイを扱っているときは、リターンが小さくなる点があります。高度に圧縮された比較的小さなJPGイメージは、「かなり十分に良い」ものになる可能性があります。 –

0

を囲むコードをのスニペット、つまり「取得されたデータの管理方法」には表示しないでください。たとえば、同時に「10または12の画像」をメモリに保持することは不可能です(!)... と-d-dそれぞれのデバイスは異なります! (あなたは開発者として自然に「デックアウト」デバイスを購入しますが、実際の顧客は食料品店で携帯電話を購入しました。)最近検索したイメージだけをメモリに保存する何らかのスキームを設計する必要があります。

可能な戦略の1つは、これらのイメージをオブジェクトに「弱い参照」を持つコレクションに保持されているオブジェクトに格納することです。メモリマネージャがメモリ不足の場合、それらのオブジェクトを収集できます。 (これについての良い議論はhttp://javapapers.com/core-java/java-weak-reference/で見つけることができます)あなたのコードは、オブジェクトが刈り取られているかどうかをチェックする準備ができていなければなりません。それは、「メモリ不足」例外をスローします場合

また、あなたのコードは、優雅でなければなりません!たぶんその場合自発的にはコンテナ内の最も古いエントリをスローしてから操作を再試行します。等々。モバイルの世界では、「無制限の仮想メモリ」の贅沢はありません。メモリは実際のリソースです。