2012-08-02 13 views
2

我做了一個android應用程序,當網絡不可用時,圖像將保存到本地數據庫。我保持數據庫表中的圖像uri,並從圖像uri中檢索圖像,並使用自定義數組適配器在的上顯示該圖像。當我使用模擬器運行我的應用程序時,它運行良好。不過在使用Android手機時卻顯示強制關閉錯誤爲什麼我的android應用程序的自定義ArrayAdapter沒有顯示圖像?

錯誤日誌如下:

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); 

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) 

我的自定義適配器如下

我注意到調試,適配器正在被稱爲六次當時的形象只有兩個五次它返回一個視圖第六次它顯示該錯誤。

回答

1

我找到了解決辦法。我應該知道的關於android應用程序的內存管理的東西。 http://www.youtube.com/watch?v=_CruQY55HOk。當我試圖直接在ImageView上顯示圖像Uri時,則會產生問題。我每個人都應該避免像這樣ImageView.setImageURI(Uri.parse(imageUri))的代碼。相反,嘗試加載位圖或在imageview上繪製。

2

閱讀此:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html ,您將能夠加載您的圖像沒有任何錯誤!

+0

我敢肯定,壓縮位圖將不會在這種情況下完全幫助 - 應用程序將forceclose不上sixs的時間,但是,16S'(對於〔實施例)=) – dilix 2012-08-02 10:46:00

+1

這不是壓縮,這是關於加載縮小版的圖像。在屏幕上,您不需要顯示8Mp圖像。只需加載縮小到您的屏幕大小的圖像。 – 2012-08-02 10:51:57

+0

「我從調試中注意到,適配器在圖像只有兩個時調用了六次」 - 正如您所看到的,即使他將圖像縮小了一些,問題不僅出現在縮放圖像中,它也只會幫助您不會掉到六個'一步 - 但它會在一段時間後關閉。 – dilix 2012-08-02 10:55:50

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; 
    } 
相關問題