2014-01-21 2 views
-1

Я всегда сталкиваюсь с этой проблемой. Прошел много вопросов по этому поводу (а именно: this pdf, link, link и т. Д.). Поскольку я все еще наивна в Android, может ли кто-нибудь помочь мне в этом?Android: из памяти при размещении 3240016 байт

Logcat:

01-20 22:41:50.644: D/dalvikvm(4838): GC_BEFORE_OOM freed <1K, 14% free 55713K/64583K, paused 20ms, total 20ms 
01-20 22:41:50.644: E/dalvikvm-heap(4838): Out of memory on a 3240016-byte allocation. 
01-20 22:41:50.644: I/dalvikvm(4838): "main" prio=5 tid=1 RUNNABLE 
01-20 22:41:50.644: I/dalvikvm(4838): | group="main" sCount=0 dsCount=0 obj=0x40e11508 self=0x40d2e9a0 
01-20 22:41:50.644: I/dalvikvm(4838): | sysTid=4838 nice=0 sched=0/0 cgrp=apps handle=1075126064 
01-20 22:41:50.644: I/dalvikvm(4838): | schedstat=(3230609420 544631405 2986) utm=302 stm=21 core=0 
01-20 22:41:50.644: I/dalvikvm(4838): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:476) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.content.res.Resources.loadDrawable(Resources.java:1963) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.content.res.Resources.getDrawable(Resources.java:672) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.view.View.setBackgroundResource(View.java:14480) 
01-20 22:41:50.649: I/dalvikvm(4838): at axaart.collectors.adapter.CustomListAdapter.getView(CustomListAdapter.java:82) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.widget.AbsListView.obtainView(AbsListView.java:2461) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.widget.ListView.makeAndAddView(ListView.java:1775) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.widget.ListView.fillDown(ListView.java:678) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.widget.ListView.fillFromTop(ListView.java:739) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.widget.ListView.layoutChildren(ListView.java:1628) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.widget.AbsListView.onLayout(AbsListView.java:2296) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.view.View.layout(View.java:14055) 
01-20 22:41:50.649: I/dalvikvm(4838): at android.view.ViewGroup.layout(ViewGroup.java:4604) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.LinearLayout.onLayout(LinearLayout.java:1426) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.View.layout(View.java:14055) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.ViewGroup.layout(ViewGroup.java:4604) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.View.layout(View.java:14055) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.ViewGroup.layout(ViewGroup.java:4604) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1585) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.View.layout(View.java:14055) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.ViewGroup.layout(ViewGroup.java:4604) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.LinearLayout.onLayout(LinearLayout.java:1426) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.View.layout(View.java:14055) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.ViewGroup.layout(ViewGroup.java:4604) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.View.layout(View.java:14055) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.ViewGroup.layout(ViewGroup.java:4604) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.View.layout(View.java:14055) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.ViewGroup.layout(ViewGroup.java:4604) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.View.layout(View.java:14055) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.ViewGroup.layout(ViewGroup.java:4604) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.widget.LinearLayout.onLayout(LinearLayout.java:1426) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.View.layout(View.java:14055) 
01-20 22:41:50.654: I/dalvikvm(4838): at android.view.ViewGroup.layout(ViewGroup.java:4604) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.view.View.layout(View.java:14055) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.view.ViewGroup.layout(ViewGroup.java:4604) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1992) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1813) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1112) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4472) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.view.Choreographer.doFrame(Choreographer.java:525) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.os.Handler.handleCallback(Handler.java:615) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.os.Looper.loop(Looper.java:137) 
01-20 22:41:50.659: I/dalvikvm(4838): at android.app.ActivityThread.main(ActivityThread.java:4898) 
01-20 22:41:50.659: I/dalvikvm(4838): at java.lang.reflect.Method.invokeNative(Native Method) 
01-20 22:41:50.659: I/dalvikvm(4838): at java.lang.reflect.Method.invoke(Method.java:511) 
01-20 22:41:50.659: I/dalvikvm(4838): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
01-20 22:41:50.659: I/dalvikvm(4838): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
01-20 22:41:50.659: I/dalvikvm(4838): at dalvik.system.NativeStart.main(Native Method) 
01-20 22:41:50.664: A/libc(4838): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 4838 (aart.collectors) 

CustomListAdapter.java

public class CustomListAdapter extends ArrayAdapter<ItemDetailTO> { 

    private List<ItemDetailTO> aList; 
    private List<ItemDetailTO> orignalList; 
    private LayoutInflater inflater; 
    private ItemDetailTO info = null; 
    private byte[] decodeStringImage; 
    Bitmap decodedByteImage; 
// private TextView txtvwLocation; 
// private Context context; 

    public CustomListAdapter(Context context, int textViewResourceId, List<ItemDetailTO> list) { 
     super(context, textViewResourceId, list); 
     // TODO Auto-generated constructor stub 
//  this.context = context; 
     this.aList = list; 
     this.orignalList = list; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
//  inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.common_list_item, parent, false); 
      holder = new ViewHolder(convertView); 
      convertView.setTag(R.id.holder, holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(R.id.holder); 
     } 
//  View rowView = inflater.inflate(R.layout.common_list_item, parent, false); 
     ListColor listColorInstance = new ListColor(); 

//  if(view == null) { 
//   view = inflater.inflate(R.layout.common_list_item, parent, false);   
//  } 

     listColorInstance.listcolorsetter(convertView, position); 
     info = aList.get(position); 

     if(info != null) { 
      holder.txtvwTitle.setText(info.getsTitle()); 
      holder.txtvwCategory.setText(info.getsCategory()); 

      if (info.getsCcy() != null) { 
       holder.txtvwValue.setText(String.format("%.2f", info.getdValue()) + " " + info.getsCcy()); 
      } else { 
       holder.txtvwValue.setText(String.format("%.2f", info.getdValue())); 
      } 

      if(info.getImage() != null) { 
       decodeStringImage = Base64.decode(info.getImage(), Base64.DEFAULT); 
       decodedByteImage = BitmapFactory.decodeByteArray(decodeStringImage, 0, decodeStringImage.length); 
       holder.imgvwItemImage.setImageBitmap(decodedByteImage); 
      } else { 
       holder.imgvwItemImage.setBackgroundResource(R.drawable.image_placeholder); 
      } 
     } 

     if (decodedByteImage != null) { 
      decodedByteImage = null; 
      System.gc(); 
     } 

//  return rowView; 
     return convertView; 
    } 

    @Override 
    public int getCount() { 
     return aList.size(); 
    } 

    public void resetData() { 
     // TODO Auto-generated method stub 
     aList = orignalList; 
    } 

    private class ViewHolder { 
     private ImageView imgvwItemImage; 
     private TextView txtvwTitle; 
     private TextView txtvwCategory; 
     private TextView txtvwValue; 

     public ViewHolder(View root) { 
      imgvwItemImage = (ImageView) root.findViewById(R.id.imgvwItemImage); 
      txtvwTitle = (TextView) root.findViewById(R.id.txtvwtitle); 
      txtvwCategory = (TextView) root.findViewById(R.id.txtvwcategory); 
      txtvwValue = (TextView) root.findViewById(R.id.txtvwvalue); 
     } 
    } 
} 

Примечание:

Эта проблема появляется, когда я пытаюсь заполнить мой ListView в любой несколько видов деятельности.

ответ

0

Android имеет очень строгий предел того, сколько памяти может выделить одно приложение для себя. Несмотря на то, что на устройстве имеется доступная память, это не означает, что ОС предоставит его вам. Таким образом, вы в значительной степени не повезло. Вот что вы можете сделать:

  1. Используйте более эффективное представление данных, которое не требует таких больших распределений. Возможно, вы могли бы сжать/предварительно обработать данные в веб-службе за пределами вашего устройства.

  2. Если это не вариант, вы можете создать собственное изображение платформы и изменить настройки предела памяти для каждого приложения. Look here for more information.

  3. Если (2) не является для вас вариантом. Вы можете написать собственный lib, который будет хранить данные для вас. Предел памяти применяется только к распределениям Java/Dalvik. Родной код может делать все, что захочет.

+0

Спасибо за ваш ответ. Можете ли вы предоставить мне пример кода для варианта 3 в соответствии с моим сценарием, где я декодирую строку base64 в изображение и отображая ее в изображении? – VikramV

1

Каждый растровый рисунок, который вы используете, стоит 4 мб в мемуаре. Вы можете использовать измененное растровое изображение следующим способом.

private Bitmap decodeBitmap(int targetWidth, int targetHeight) throws IOException { 
    final BitmapFactory.Options opts = new BitmapFactory.Options(); 
    opts.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(getAssets().open("frog.jpg"), null, opts); 

    opts.inSampleSize = getBitmapSampleSize(opts, targetWidth, targetHeight); 

    opts.inJustDecodeBounds = false; 

    return BitmapFactory.decodeStream(getAssets().open("frog.jpg"), null, opts); 
} 

private int getBitmapSampleSize(BitmapFactory.Options opts, int targetWidth, int targetHeight) { 
    final int width = opts.outWidth; 
    final int height = opts.outHeight; 
    Log.d("tag", "bitmap's size is " + width + ", " + height); 
    int inSampleSize = 1; 

    if (height > targetHeight || width > targetWidth) { 
     if (width > height) { 
      inSampleSize = (int) Math.floor((float)height/(float)targetHeight); 
     } else { 
      inSampleSize = (int) Math.floor((float)width/(float)targetWidth); 
     } 
    } 
    Log.d("tag", "target size is " + targetWidth + ", " + targetHeight); 
    Log.d("tag", "inSampleSize is " + inSampleSize); 
    return inSampleSize; 
} 
4

Вы можете попробовать, добавив эту строку в файл манифеста. Он будет выделять большую память для вашего приложения.

android:largeHeap="true" 
Смежные вопросы