Reputation: 178
I am developing a Xamarin (PCL) cross platform app that i am currently testing on my Android Physical devices and Emulators. The app runs perfectly on the high-end phones, but "crashes unexpectedly" on the Samsung S4 and such low-end phones. It crashes only after i perform multiple activities and tasks.
I am assuming that has something to do with the task-thread-capacity of these phones. If i am right in that regard, how am i supposed to make my app such that it works smoothly and error free on all phones?
Edit - The error says "The app has closed unexpectedly". This error doesn't appear on a specific line because it has nothing to do with the code. It breaks only on certain "older" phones when many activities are performed. Example of activities include, Add data to database, updating/deleting them, moving from one activity to another, showing calendars and pie-charts from user entered data.
Edit 2 -Some of the Code that deals with images:
Xaml:
<ScrollView HorizontalOptions="Fill" Orientation="Horizontal">
<StackLayout Orientation="Vertical" BackgroundColor="GhostWhite" >
<StackLayout Orientation="Horizontal" BackgroundColor="GhostWhite" >
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="dairy" Image="{Binding Dairy_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="alcohol" Image="{Binding Alcohol_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="eggs" Image="{Binding Egg_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="fastfood" Image="{Binding Fastfood_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="fish" Image="{Binding Fish_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="fruit" Image="{Binding Fruit_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="grain" Image="{Binding Grain_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="legume" Image="{Binding Legume_Image}"/>
</StackLayout>
<StackLayout Orientation="Horizontal" BackgroundColor="GhostWhite" >
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="meat" Image="{Binding Meat_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="munchies" Image="{Binding Munchies_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="nuts" Image="{Binding Nut_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="potato" Image="{Binding Potato_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="soda" Image="{Binding Soda_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="sweets" Image="{Binding Sweet_Image}"/>
<Button HeightRequest="50" BackgroundColor="GhostWhite" WidthRequest="50" Command="{Binding Button_Clicked_Food}" CommandParameter="vegetables" Image="{Binding Vegetable_Image}"/>
</StackLayout>
</StackLayout>
.CS:
public UserMealINC_vm(User_Profiles up, DateTime day)
{
try
{
Day = day;
User_pro = up;
Bool_Food_Type = false;
Food_Name = "";
Type = "";
Food_Weight = "0";
Selected_Food = new List<string>();
//All meal item are first initialized with the non-coloured images
Dairy_Image = "drawable/dairy.png";
Alcohol_Image = "drawable/alcohol.png";
Egg_Image = "drawable/eggs.png";
Fastfood_Image = "drawable/fastfood.png";
Fish_Image = "drawable/fish.png";
Fruit_Image = "drawable/fruit.png";
Grain_Image = "drawable/grain.png";
Legume_Image = "drawable/legume.png";
Meat_Image = "drawable/meat.png";
Munchies_Image = "drawable/munchies.png";
Nut_Image = "drawable/nuts.png";
Potato_Image = "drawable/potato.png";
Soda_Image = "drawable/soda.png";
Sweet_Image = "drawable/sweets.png";
Vegetable_Image = "drawable/vegetables.png";
this.Button_Clicked_Food = new Command<string>((key) =>
{
//Change the item selected from color to non-color, or vice-versa
if (Selected_Food.Contains(key))
{
if (key == "dairy")
{
Dairy_Image = "drawable/dairy.png";
}
else if (key == "alcohol")
{
Alcohol_Image = "drawable/alcohol.png";
}
else if (key == "eggs")
{
Egg_Image = "drawable/eggs.png";
}
else if (key == "fastfood")
{
Fastfood_Image = "drawable/fastfood.png";
}
else if (key == "fish")
{
Fish_Image = "drawable/fish.png";
}
else if (key == "fruit")
{
Fruit_Image = "drawable/fruit.png";
}
else if (key == "grain")
{
Grain_Image = "drawable/grain.png";
}
else if (key == "legume")
{
Legume_Image = "drawable/legume.png";
}
else if (key == "meat")
{
Meat_Image = "drawable/meat.png";
}
else if (key == "munchies")
{
Munchies_Image = "drawable/munchies.png";
}
else if (key == "nuts")
{
Nut_Image = "drawable/nuts.png";
}
else if (key == "potato")
{
Potato_Image = "drawable/potato.png";
}
else if (key == "soda")
{
Soda_Image = "drawable/soda.png";
}
else if (key == "sweets")
{
Sweet_Image = "drawable/sweets.png";
}
else if (key == "vegetables")
{
Vegetable_Image = "drawable/vegetables.png";
}
else
{
//Key out of bounds???
}
Selected_Food.Remove(key);
}
else
{
if (key == "dairy")
{
Dairy_Image = "drawable/dairy_color.png";
}
else if (key == "alcohol")
{
Alcohol_Image = "drawable/alcohol_color.png";
}
else if (key == "eggs")
{
Egg_Image = "drawable/eggs_color.png";
}
else if (key == "fastfood")
{
Fastfood_Image = "drawable/fastfood_color.png";
}
else if (key == "fish")
{
Fish_Image = "drawable/fish_color.png";
}
else if (key == "fruit")
{
Fruit_Image = "drawable/fruit_color.png";
}
else if (key == "grain")
{
Grain_Image = "drawable/grain_color.png";
}
else if (key == "legume")
{
Legume_Image = "drawable/legume_color.png";
}
else if (key == "meat")
{
Meat_Image = "drawable/meat_color.png";
}
else if (key == "munchies")
{
Munchies_Image = "drawable/munchies_color.png";
}
else if (key == "nuts")
{
Nut_Image = "drawable/nuts_color.png";
}
else if (key == "potato")
{
Potato_Image = "drawable/potato_color.png";
}
else if (key == "soda")
{
Soda_Image = "drawable/soda_color.png";
}
else if (key == "sweets")
{
Sweet_Image = "drawable/sweets_color.png";
}
else if (key == "vegetables")
{
Vegetable_Image = "drawable/vegetables_color.png";
}
else
{
//Key out of bounds???
}
Selected_Food.Add(key);
}
});
}
catch (Exception ex)
{
App.Current.MainPage.DisplayAlert("UserMealINC_vm 1!", ex.Message, "OK");
}
}
Upvotes: 1
Views: 88
Reputation: 178
It turns out that the device memory was getting overflowed by all the multiple images i had in my App. (As suggested by @hvaughan3)
This link has the answer to it.
You basically just have to add these two lines in you Android Manifest (Under Application) -
android:hardwareAccelerated="false"
android:largeHeap="true"
Upvotes: 1