Everytime I test my app, it crashes after the splashscreen and it gives errors like:
02-14 13:03:29.305: A/libc(9935): Fatal signal 11 (SIGSEGV) at 0x0000015c (code=1), thread 9935 (ter.planyourday)
and
02-14 13:03:29.260: E/dalvikvm-heap(9935): Out of memory on a 2381200-byte allocation.
My ImageAdapter looks like this:
public class ImageAdapter extends BaseAdapter {
private Context context;
private final String[] buttonValues;
public ImageAdapter(Context context, String[] buttonValues) {
this.context = context;
this.buttonValues = buttonValues;
}
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
if (convertView == null) {
gridView = new View(context);
// get layout from mobile.xml
gridView = inflater.inflate(R.layout.mobile, null);
// set image based on selected text
ImageView imageView = (ImageView) gridView
.findViewById(R.id.grid_item_image);
String button = buttonValues[position];
if (button.equals("homework")) {
imageView.setImageResource(R.drawable.button_homework);
} else if (button.equals("schedule")) {
imageView.setImageResource(R.drawable.button_schedule);
} else if(button.equals("planner")) {
imageView.setImageResource(R.drawable.button_planner);
}else{
imageView.setImageResource(R.drawable.button_settings);
}
} else {
gridView = (View) convertView;
}
return gridView;
}
@Override
public int getCount() {
return buttonValues.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
And here the method in the main activity:
static final String[] MOBILE_OS = new String[] { "homework", "schedule",
"planner", "settings" };
private void setGridView() {
gridView = (GridView) findViewById(R.id.gridView1);
gridView.setAdapter(new ImageAdapter(this, MOBILE_OS));
gridView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
switch (position) {
case 0:
Intent startHomework = new Intent(HomeScreen.this,
HomeworkScreen.class);
HomeScreen.this.startActivity(startHomework);
break;
case 1:
Intent startSchedule = new Intent(HomeScreen.this,
ScheduleScreen.class);
HomeScreen.this.startActivity(startSchedule);
break;
case 2:
Intent startPlanner = new Intent(HomeScreen.this,
PlannerScreen.class);
HomeScreen.this.startActivity(startPlanner);
break;
case 3:
Intent startSettings = new Intent(HomeScreen.this,
SettingScreen.class);
HomeScreen.this.startActivity(startSettings);
break;
}
}
});
}
I hope somebody can help me!
Thanks in advance ;) Wouter
This is because, you are not using the Lazy loading of images properly.
The correct way would be:
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
ImageView imageView;
String button;
if (convertView == null) {
gridView = new View(context);
// get layout from mobile.xml
gridView = inflater.inflate(R.layout.mobile, null);
// set image based on selected text
imageView = (ImageView) gridView
.findViewById(R.id.grid_item_image);
} else {
gridView = (View) convertView;
}
button = buttonValues[position];
if (button.equals("homework")) {
imageView.setImageResource(R.drawable.button_homework);
} else if (button.equals("schedule")) {
imageView.setImageResource(R.drawable.button_schedule);
} else if(button.equals("planner")) {
imageView.setImageResource(R.drawable.button_planner);
}else{
imageView.setImageResource(R.drawable.button_settings);
}
return gridView;
}
EDIT: Now replace your getView() with this getView().
Even this is not the best way. You should create a Holder which will hold your views properly.
To best understand how to reuse the garbage collected views, please see this: http://android.amberfog.com/?p=296
As you are facing OOME, you may also consider my answer on same type of question. bitmap size exceeds Vm budget error android
Thank you.
If you are using ics with version 4.1.2 or higher, your problem may be related to the problem states at this site.
It is explained there that the latest versions of android have a different kind of a garbage collector and it handles the big data in a different way. I had the same problem and solved by using smaller images. I whish this solves your issue.
User contributions licensed under CC BY-SA 3.0