2017-06-29 52 views
0

我的問題是什麼(KISS)? ,詳細顯示了第三個圖片後,我的應用程序崩潰導致內存溢出我的應用程序Android OutOfMemory

背景資料: 我做了一個脫機超市。所有產品都以ListView顯示。 我使用的所有圖像都被存儲爲由SugarORM在sqlite數據庫中的字符串(來自每個圖像的Uri)。 ListView元素獲得了一個ArrayAdapter,其中ListView中的每個項目的信息都被設置。 像這樣:

ImageView imageView = (ImageView) rowView.findViewById(R.id.productimage); 
Handler handler = new Handler(); 
handler.post(new Runnable() { 
    @Override 
    public void run() { 
     imageView.setImageURI(productList.get(position).getPictureUri()); 
     handler.removeCallbacks(this); 
    } 
}); 

我的目的是,要在後臺加載的圖片點擊它,加載圖像,甚至之前(但它did'nt工作對我來說:顯示在圖像/,但我無法點擊任何其他視圖元素,而加載圖像)。 的 「getPictureUri」 會從圖片的URI管理員已choosen與下面的代碼的產品:

Intent pickPhoto = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
startActivityForResult(pickPhoto,1); 

AndroidManifest.xml中

android:hardwareAccelerated="false" 
android:largeHeap="true" 

我只延伸從「AppCompatActivity「(需要工具欄)。這意味着:我不會使用「活動」甚至一次。

任何人都可以給我一個很好的建議,如何清除緩存的圖像(我認爲這可能是問題),此外,也許你有一個時間來幫助我與我的「圖像異步加載,而你可以在應用程序中自由移動「問題。

+0

關於凍結:正如setImageUri的文檔所說:「這會在UI線程上進行位圖讀取和解碼,這可能會導致延遲打嗝,如果這是一個問題,請考慮使用setImageDrawable(Drawable)或setImageBitmap(android.graphics。位圖)和BitmapFactory。「 https://developer.android.com/reference/android/widget/ImageView.html#setImageURI(android.net.Uri) –

+0

但是,適當的圖像加載很難實現。我建議爲此使用庫,Glide https://github.com/bumptech/glide即使使用默認設置也非常出色。它甚至可以解決你的問題,因爲內存不足異常。 –

+0

@ josef.adamcik第1條評論:感謝您的建議,我現在可以看看它。第2條評論:我想僅使用我的應用程序離線。我不認爲,這種下滑爲我提供了可能性(只是假定它只適用於在線URL),以從URI加載圖像,這些圖像保存在手機中。 –

回答

1

使用setImageUri()在內存上相當密集,特別是在嘗試從本地資源加載大型位圖時。相反,對於任何/所有圖像加載任務,請使用經過驗證的真實解決方案,如PicassoGlide。這些庫將脫機工作,絕對可以從指向本地資源的URI加載圖像,並且很可能會解決您在加載圖像時遇到的所有內存問題。

+0

不錯,它很容易使用,並節省了很多內存。謝謝。 –