2011-10-18 15 views
0

ディレクトリから画像を表示するリストビューがあり、画像をうまく読み込んでいますが、スクロールしてスクロールした後にスクロールすると、画面から指を離して戻す必要があります画面をスクロールして元に戻します。また、スクロールが速すぎると、OutOfMemoryErrorというlogcatでアプリケーションがクラッシュします。ここimageviewがクラッシュする

は私のコードです:

package com.search.visual; 


import java.io.File; 
import java.io.FilenameFilter; 

import android.app.ListActivity; 
import android.content.Context; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 


public class history extends ListActivity{ 

private String dir = ".vis"; 
private File images; 
private File [] imageList; 
private File item; 
private Uri [] ImageRef; 
private ImageView imageView; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.history); 




    loadPics(); 



} 



public class ImageAdapter extends BaseAdapter { 
    int Background; 
    private Context con; 



    public ImageAdapter(Context c) { 
     con = c; 
     TypedArray attr = con.obtainStyledAttributes(R.styleable.HelloGallery); 
     Background = attr.getResourceId(
       R.styleable.HelloGallery_android_galleryItemBackground, 0); 
     attr.recycle(); 
    } 

    public int getCount() { 
     return ImageRef.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 



     imageView = new ImageView(con); 
     imageView.setImageURI(ImageRef[position]); 
     imageView.setLayoutParams(new ListView.LayoutParams(75, 75)); 
     imageView.setScaleType(ImageView.ScaleType.FIT_XY); 

     imageView.setBackgroundResource(Background); 

     return imageView; 
    } 


} 

protected void onListItemClick(ListView l, View v, int position, long id) { 

    item = imageList[position]; 
    Intent i = new Intent("com.search.visual.IMAGE"); 

     i.putExtra(Intent.EXTRA_STREAM, item); 
     startActivity(i);   //StIntring imname = (String) ; 
    } 





@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    loadPics(); 
    super.onResume(); 
} 

public void loadPics(){ 

    images = Environment.getExternalStoragePublicDirectory(dir); 
    imageList = images.listFiles(new FilenameFilter() { 

     public boolean accept(File dir, String filename) { 
      // TODO Auto-generated method stub 
      return (filename.endsWith(".jpg")); 
     } 
    }); 

    if(imageList.length > 0){ 
    ImageRef = new Uri[imageList.length]; 

    for(int i = 0; i<imageList.length; i++){ 
     ImageRef[i] = Uri.parse(imageList[i].getAbsolutePath()); 

    } 

    setListAdapter(new ImageAdapter(this)); 
    }else{ 
     Intent i = new Intent("com.search.visual.ERROR"); 
     startActivity(i); 
    } 
} 


} 

誰もが1これはあなたの助けが起こっている理由として任意の手掛かりが大幅

答えて

1

をいただければ幸いしている場合は、リストビューをスクロールすると、すべての画像がnative heapに格納されていますrecycler of native heap is too lazy。リストビューからのスクロールされた画像から収集ゴミが遅くなるので、あなたのdevice's heap is become fullとあなたはOutOfMemory Exceptionを取得します。

だから私はsholud try your own recyclerあなたのアプリケーションではごみの画像と使用された画像のfree the memoryと思う。

ビットマップをリサイクルする必要があります。ビットマップの実装はネイティブであるため、Javaオブジェクトは小さく、Javaガベージコレクションの候補は不十分ですが、メモリはまだ割り当てられています。タカを見てBitmap.recycle()

それ以外の場合はLazzy Loading images in Listviewを試してみてください。

Android: Strange out of memory issueOutOfMemory exception appears while scrolling the list of images

感謝。

+0

'Uri Array'を' Bitmap array'にスワップして問題をソートしました。メモリ問題が消えてしまっているように見えて、スクロールの問題があなたの助けとアドバイスに感謝してしまいました。 –

関連する問題