2016-11-07 67 views
0

我有ListView和圖片,一個問題,當在某一時刻的圖像集讓我java.lang.OutOfMemoryError,這是我在getviewjava.lang.OutOfMemoryError在ListView控件

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

     ViewHolder viewHolder; // view lookup cache stored in tag 
     if(convertView == null) { 
      viewHolder = new ViewHolder(); 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.category_list_item, parent, false); 
      viewHolder.image = (ImageView) convertView.findViewById(R.id.Icon); 
      viewHolder.name = (TextView) convertView.findViewById(R.id.nombreCategoriaTextView); 
      viewHolder.name.setText(categories.getCategories(position).getName()); 
      try { 
       DataBaseImageManager manager = new DataBaseImageManager(context); 
       Bitmap mIcon11 = manager.getListByName(categories.getCategories(position).getURLImage()); 
       if (mIcon11 == null) 
        new DownloadImageTask(viewHolder.image, context) 
          .execute(categories.getCategories(position).getURLImage()); 
       else { 
        (viewHolder.image).setImageBitmap(mIcon11); 
       } 
      }catch (Exception e){} 
      convertView.setTag(viewHolder); 
     }else{ 
      viewHolder = (ViewHolder)convertView.getTag(); 
     } 
     return convertView; 
    } 

實現一個ArrayAdapter的我把我的圖片在SQLite和我decodified從ByteArray中實現的下一個

public Bitmap getListByName(String name) { 
     Bitmap bmp = null; 
     try { 
      DataSource.open(); 
      List<DatosImage> datos = DataSource.obtenerRegistros(name); 
      for (DatosImage dato : datos) { 
       bmp = BitmapFactory.decodeByteArray(dato.getValue(), 0, dato.getValue().length); 
      } 
      DataSource.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return bmp; 
    } 

這可以從我的問題soulution或什麼是我的代碼撥錯了位圖?

the error is the nextFATAL EXCEPTION: main 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime: Process: mx.com.sithec.cic, PID: 19660 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime: java.lang.OutOfMemoryError 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:500) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:523) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at mx.com.sithec.cic.ImageHelper.DataBaseImageManager.getListByName(DataBaseImageManager.java:31) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at mx.com.sithec.cic.Adapters.CompanyAdapter.getView(CompanyAdapter.java:102) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.widget.AbsListView.obtainView(AbsListView.java:2283) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.widget.ListView.makeAndAddView(ListView.java:1790) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.widget.ListView.fillUp(ListView.java:725) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.widget.ListView.fillGap(ListView.java:664) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5423) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4534) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.view.Choreographer.doFrame(Choreographer.java:543) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:733) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:136) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5070) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at java.lang.reflect.Method.invokeNative(Native Method) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:515) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
11-07 12:31:24.490 19660-19660/? E/AndroidRuntime:  at dalvik.system.NativeStart.main(Native Method) 
+0

POST錯誤日誌。 –

回答

0

getListByName()中的for循環看起來很奇怪。您可能正在創建多個位圖(如果您在一次運行中有許多位圖,則可能會導致OutOfMemoryError異常),但只返回一個。

什麼,你可能應該做的是一樣的東西:

public Bitmap getListByName(String name) { 
    try { 
     DataSource.open(); 
     List<DatosImage> datos = DataSource.obtenerRegistros(name); 
     for (DatosImage dato : datos) { 
      Bitmap bmp = BitmapFactory.decodeByteArray(dato.getValue(), 0, dato.getValue().length); 
      if (bmp != null) { 
       DataSource.close(); 
       return bmp; 
      } 
     } 
     DataSource.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+0

謝謝!這個對我有用!你是一個破解! –

0

的問題可能是,其實,要創建位圖對象列表中的每一行。這是ver memory昂貴的操作,特別是如果bitmaps大而且數量衆多。

我覺得這個問題應對的最簡單的方法是簡單地使用已經存在的這種情況(加載圖像從URL到圖像視圖)的圖書館之一。讓我給你一些例子

Picasso

使用非常簡單,只需將它添加到古爾的build.gradle

compile 'com.squareup.picasso:picasso:2.5.2'

然後你的代碼中:

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

如果您仍然希望緩存你的圖像數據庫,你可以使用畢加索爲:

Picasso.with(this).load("url").into(new Target() 
{ 
    @Override 
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) 
    { 
     image.setImageBitmap(bitmap); 
     //Code for DB save 
    } 
    @Override 
    public void onBitmapFailed(Drawable errorDrawable) 
    { 
     image.setImageDrawable(errorDrawable); 
    } 
    @Override 
    public void onPrepareLoad(Drawable placeHolderDrawable) 
    { 
     image.setImageDrawable(placeHolderDrawable); 
    } 
}); 

你可能也想看看FrescoGlide

+0

感謝您的提示!它是一個偉大的工具 –