1

ネットワークが利用できないときに画像がローカル データベースに保存される Android アプリケーションを作成しました。データベーステーブル内に画像uriを保持し、画像uriから画像を取得し、カスタム配列アダプターを使用してその画像を表示していimageViewますlistView 。エミュレーターでアプリケーションを実行している場合、正常に動作しています。ただし、Android携帯電話を使用しているときに強制終了エラーが表示されます

エラーログを以下に示します。

java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:504)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:370)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:715)
at android.graphics.drawable.Drawable.createFromStream(Drawable.java:675)
at android.widget.ImageView.resolveUri(ImageView.java:525)
at android.widget.ImageView.setImageURI(ImageView.java:309)
at com.freedom.net.Syncho2$NoteListAdapter.getView(Syncho2.java:219)
at android.widget.AbsListView.obtainView(AbsListView.java:1519)
at android.widget.ListView.makeAndAddView(ListView.java:1749)
at android.widget.ListView.fillDown(ListView.java:674)
at android.widget.ListView.fillFromTop(ListView.java:731)
at android.widget.ListView.layoutChildren(ListView.java:1602)
at android.widget.AbsListView.onLayout(AbsListView.java:1349)
at android.view.View.layout(View.java:7320)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1263)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1137)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1051)
at android.view.View.layout(View.java:7320)
at android.widget.FrameLayout.onLayout(FrameLayout.java:342)
at android.view.View.layout(View.java:7320)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1263)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1137)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1051)
at android.view.View.layout(View.java:7320)
at android.widget.FrameLayout.onLayout(FrameLayout.java:342)
at android.view.View.layout(View.java:7320)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1162)

MY カスタム アダプターは次のとおりです。

public class NoteListAdapter extends  ArrayAdapter<ImageFromDB> {
Context c;

ArrayList<ImageFromDB> image = null;
ArrayList<String> uriImage = null;
ArrayList<Integer> ID = null;

private AllId allid = null;
DBAdapter db = null;

WatchListAllEntity watchListAllEntity=null;
int flagVariable=1;
private ArrayList<ImageFromDB> items;

public NoteListAdapter(Context context, int textViewResourceId,
        ArrayList<ImageFromDB> items) {

    super(context, textViewResourceId, items);
    Log.e("sf","123");
    this.items = items;
    c=context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;

    final int myPosition = position;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.listitempict2, null);
    }
    ImageFromDB re = items.get(position);
    Log.e("re", re+"");
    if (re != null) {
        ImageView tt = (ImageView) v.findViewById(R.id.imageviewproduct);
        String imageUri = re.getImageuri();
        Log.e("imageUri", imageUri+"");
        tt.setImageURI(Uri.parse(imageUri));

        final CheckBox checkBox = (CheckBox) v.findViewById(R.id.checkboxproduct);
        checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {

                if (isChecked) {
                    if(flagVariable==1)
                    {
                        String ImUri = items.get(myPosition).getImageuri();
                        allid.setImageUri(ImUri);
                        allid.setId(items.get(myPosition).getId());
                        flagVariable++;
                        Log.e("flagVariable  : " , flagVariable+"");
                    }
                    else
                    {
                        checkBox.setChecked(false);
                        //Toast.makeText(Syncho2.this,"正しく選んでください。",Toast.LENGTH_SHORT).show();
                    }
                } else {
                    flagVariable=1;
                    Log.e("flagVariable  : " , flagVariable+"");
                }
            }
        });
    }
    return v;
}
}

次のようなアクティビティからこのアダプタを呼び出しています。

noteListAdapter = new NoteListAdapter(this, R.layout.listitempict, image);

デバッグから気づいたのですが、イメージが2 つしかないときにアダプターが6 回呼び出されています。5回はビューを返していますが、6回目にはそのエラーが表示されています。

4

3 に答える 3

2

これを読んでください: http://developer.android.com/training/displaying-bitmaps/load-bitmap.htmlを読む と、エラーなしで画像をロードできます!

于 2012-08-02T10:40:28.720 に答える
0

私は解決策を見つけました。Android アプリケーションのメモリ管理について、誰もが知っておくべきことです。http://www.youtube.com/watch?v=_CruQY55HOk . ImageView で画像 Uri を直接表示しようとすると、問題が発生します。この ImageView.setImageURI(Uri.parse(imageUri)) のようなコードは避けるべきだと思います。その代わりに、ビットマップまたはドローアブルをイメージビューにロードしてみてください。

于 2012-09-10T10:25:13.330 に答える
0
 public View getView(int position, View convertView, ViewGroup parent) {        

        View row = convertView;
     // if it's not recycled, initialize some attributes
        if (row == null) {  
            LayoutInflater li = (LayoutInflater)   mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
            row = li.inflate(R.layout.menucategory, null);          
            //imageView.setLayoutParams(new GridView.LayoutParams(85, 85));         
        }
            // getCategoryItem          
            Category  category = (Category) getItem(position);
            // Get reference to ImageView
            categoryIcon = (ImageView) row.findViewById(R.id.category_image);
            //categoryIcon.setLayoutParams(new GridView.LayoutParams(85, 85));
            categoryIcon.setScaleType(ImageView.ScaleType.CENTER_CROP);
            categoryIcon.setPadding(5, 5, 5, 5);

            categoryName = (TextView) row.findViewById(R.id.category_name);
            //Set category name
            categoryName.setText(category.getCategoryName());           


            if(category.getCategoryPath() != null){             
                    Bitmap bitmap = BitmapFactory.decodeFile(category.getCategoryPath());
                    System.out.println("bitmap2::  "+ bitmap);
                    if(bitmap != null){
                     categoryIcon.setImageBitmap(bitmap);
                    }               
            }                              

        return row;
    }
于 2012-08-02T11:02:49.497 に答える