0

私のアプリケーションでは、sdカードから画像をロードするこのためにグリッドビューでほぼ40から50の画像を作成しました。コンストラクターがsdカードからビットマップの配列リストのグローバル変数に画像をロードします。getviewimで配列リストからビットマップを返すと問題が発生します。このアクティビティから、ユーザーは他のアクティビティに移動します。削除ユーザーはグリッドアクティビティに戻り、アダプターを再度ロードする必要があります。これにより、「ビットマップがvmバジェットを超えています」が作成されます。だから私はSDカードから画像をロードするこの方法がわかりませんメモリリークなしでSDカードから画像をロードするために利用可能なライブラリのためのより良いアプローチはありますか

public class PicAdapter extends BaseAdapter {


    int defaultItemBackground;


    private Context galleryContext;


    Bitmap placeholder;


    public PicAdapter(Context c) {

        // instantiate context
        galleryContext = c;

        // create bitmap array
        bitmaplist=new ArrayList<Bitmap>();
        GlobalData.imageBitmaps = new WeakReference<ArrayList<Bitmap>>(bitmaplist);
        imageDescription = new ArrayList<String>();
        imagetitle = new ArrayList<String>();


        picturesCursor.moveToFirst();
        int i = 0;
        for (i = 0; i < picturesCursor.getCount(); i++) {



            String imagepath = picturesCursor.getString(picturesCursor
                    .getColumnIndex("img"));
            File cacheimage=new File(imagepath);

            if(!cacheimage.exists())
            {
                dBopenHelper.deleteHappyMoments(imagepath);

            }
            else
            {
            Bitmap bitmap = 
                    ViewUtils.decodeSampledBitmapFromResource(imagepath,
                            AppConstants.FRAME_WIDTH,
                            AppConstants.FRAME_HEIGHT);

            ViewUtils.recycleBitmapFrame();
            GlobalData.imageBitmaps.get().add(bitmap);
            imageDescription.add(picturesCursor.getString(picturesCursor
                    .getColumnIndex("image_description")));
            imagetitle.add(picturesCursor.getString(picturesCursor
                    .getColumnIndex("image_title")));
            picturesCursor.moveToNext();
            }

        }



        if (i == picturesCursor.getCount()) {


            Bitmap bitmap = (Bitmap) BitmapFactory.decodeResource(getResources(), R.drawable.add_new);
            GlobalData.imageBitmaps.get().add(bitmap);
            imageDescription.add(
                    "Click Add to new Pictures..............");
        }

        // get the styling attributes - use default Andorid system resources

    }

    // BaseAdapter methods

    // return number of data items i.e. bitmap images
    public int getCount() {

        return bitmaplist.size();
    }

    // return item at specified position
    public Object getItem(int position) {
        return position;
    }

    // return item ID at specified position
    public long getItemId(int position) {
        return position;
    }


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

        if (convertView == null) {
            convertView = (ImageView) getLayoutInflater().inflate(
                    R.layout.item_grid_image, null);

            convertView.setLayoutParams(new GridView.LayoutParams(
                    AppConstants.FRAME_WIDTH, AppConstants.FRAME_HEIGHT));


        }
        galleryImageView = (ImageView) convertView;


        galleryImageView.setImageBitmap(GlobalData.imageBitmaps.get().get(position));

    public void addPic(Bitmap newPic) {
        // set at currently selected index
        GlobalData.imageBitmaps.get().add(currentPic, newPic);
    }

    // return bitmap at specified position for larger display
    public Bitmap getPic(int posn) {
        // return bitmap at posn index
        return GlobalData.imageBitmaps.get().get(posn);
    }
}

サンプルコードは私を大いに助けます

前もって感謝します

4

1 に答える 1

0
  1. 画像のサイズが大きい場合は、何らかのキューを使用して画像を1つずつ表示する必要があります。
  2. それらを正しくデコードすることを確認してください。
于 2012-12-06T19:16:44.973 に答える