0

Having the next strange stackoverflow error on some devices when activity starts:

04-28 14:55:56.717: E/AndroidRuntime(4345): FATAL EXCEPTION: main
04-28 14:55:56.717: E/AndroidRuntime(4345): java.lang.StackOverflowError
04-28 14:55:56.717: E/AndroidRuntime(4345): at java.lang.ref.FinalizerReference.add(FinalizerReference.java:48)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.XmlBlock$Parser.<init>(XmlBlock.java:78)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.XmlBlock.newParser(XmlBlock.java:71)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadXmlResourceParser(Resources.java:2126)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadDrawable(Resources.java:1918)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.getDrawable(Resources.java:663)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:890)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadDrawable(Resources.java:1920)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.getDrawable(Resources.java:663)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:890)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadDrawable(Resources.java:1920)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.getDrawable(Resources.java:663)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:890)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadDrawable(Resources.java:1920)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.getDrawable(Resources.java:663)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:890)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadDrawable(Resources.java:1920)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.getDrawable(Resources.java:663)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:890)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadDrawable(Resources.java:1920)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.getDrawable(Resources.java:663)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:890)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadDrawable(Resources.java:1920)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.getDrawable(Resources.java:663)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:890)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadDrawable(Resources.java:1920)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.getDrawable(Resources.java:663)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:890)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadDrawable(Resources.java:1920)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.getDrawable(Resources.java:663)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:890)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadDrawable(Resources.java:1920)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.getDrawable(Resources.java:663)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:890)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
04-28 14:55:56.717: E/AndroidRuntime(4345):     at android.content.res.Resources.loadDrawable(Resources.java:1920
04-28 14:55:56.737: W/ActivityManager(440):   Force finishing activity com.devpocket.kvartirka/.OfferInfo
04-28 14:55:56.737: W/ActivityManager(440):   Force finishing activity com.devpocket.kvartirka/.MainActivity
04-28 14:55:57.237: W/ActivityManager(440): Activity pause timeout for ActivityRecord{417ca5f8 com.devpocket.kvartirka/.OfferInfo}

First i thought the problem is in the Google Play Services, but now i can't find out where is the problem. Also i provide my Activity code:

public class OfferInfo extends ActionBarActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {


private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;

private TextView address;
private TextView flatTypeTV;
private TextView firstPrice;
private TextView secondPrice;
private TextView thirdPrice;
private TextView metroText;
private ImageView offerImage;

private String contactNumber;
private String skypeName;
private String userID;
private String lat, lng;
private String flatAddress;
private String flatID;
private int flatsCount;

private ArrayList<String> imageGallery = new ArrayList<String>();

private GoogleMap googleMap;

private WebView webView;

private CityData cityData;
private String ownerID = "";
private String ownerName = "";

private GoogleApiClient mGoogleApiClient;

private boolean mResolvingError = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_offerinfo);

    ImageView back = (ImageView) findViewById(R.id.backButton);
    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
            finish();
        }
    });

    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    cityData = getIntent().getParcelableExtra("DATA");
    String currency = intent.getStringExtra("currencyID");

    if(extras.containsKey("ownerID")) {
        ownerID = intent.getStringExtra("ownerID");
    }

    lat = cityData.getLat();
    lng = cityData.getLng();

    Button showDialog = (Button) findViewById(R.id.showDialog);
    webView = (WebView) findViewById(R.id.webView);

    LinearLayout metroInfo = (LinearLayout) findViewById(R.id.metroInfo);

    JsonParser parser = new JsonParser();
    flatAddress = cityData.getAddress();
    flatID = cityData.getFlatID();
    String imageURL = cityData.getURL();

    JsonArray jsonArray = (JsonArray)parser.parse(cityData.getPhotosArray());

    JsonObject contacts = (JsonObject)parser.parse(cityData.getContacts());
    userID = contacts.getAsJsonPrimitive("id").getAsString();
    ownerName = contacts.getAsJsonPrimitive("name").getAsString();
    contactNumber = contacts.getAsJsonPrimitive("phone_normalized_1").getAsString();
    skypeName = contacts.getAsJsonPrimitive("skype").getAsString();
    flatsCount = contacts.getAsJsonPrimitive("flats_count").getAsInt();

    String photoURL;

    for(int i = 0; i < jsonArray.size(); i++) {
        photoURL = jsonArray.get(i).getAsString();
        imageGallery.add(i, photoURL);
    }

    offerImage = (ImageView) findViewById(R.id.offerImage);
    final ImageView imageTop = (ImageView) findViewById(R.id.imageTop);

    Ion.with(imageTop)
            .fitXY()
            .load("http:" + imageURL);

    Ion.with(offerImage)
            .fitXY()
            .load("http:" + imageURL);

    ObservableScrollView scrollView = (ObservableScrollView) findViewById(R.id.scrollView);
    offerImage.getHeight();

    ImageView photoButton = (ImageView) findViewById(R.id.photoButton);

    final RelativeLayout topLayout = (RelativeLayout) findViewById(R.id.topLayout);

    scrollView.setScrollViewCallbacks(new ObservableScrollViewCallbacks() {

        @Override
        public void onScrollChanged(int i, boolean b, boolean b1) {
            if (i > offerImage.getHeight()-topLayout.getHeight()) {
                imageTop.setVisibility(View.VISIBLE);
            } else if(i < offerImage.getHeight()) {
                imageTop.setVisibility(View.GONE);
            }

        }

        @Override
        public void onDownMotionEvent() {

        }

        @Override
        public void onUpOrCancelMotionEvent(ScrollState scrollState) {

        }
    });

    LinearLayout nightPricesLayout = (LinearLayout) findViewById(R.id.nightPricesLayout);
    if("0".equals(cityData.getNightPrice())) {
        nightPricesLayout.setVisibility(View.GONE);
    }
    LinearLayout hourPricesLayout = (LinearLayout) findViewById(R.id.hourPricesLayout);
    if("0".equals(cityData.getHourPrice())) {
        hourPricesLayout.setVisibility(View.GONE);
    }

    String metro = cityData.getMetro();
    metroText = (TextView) findViewById(R.id.metroText);
    if (TextUtils.isEmpty(metro)) {
        metroInfo.setVisibility(View.GONE);
    } else {
        metroText.setText(metro);
    }
    address = (TextView) findViewById(R.id.addressflatTV);
    address.setText(flatAddress);
    flatTypeTV = (TextView) findViewById(R.id.flatTypeTV);
    flatTypeTV.setText(cityData.getTitle());
    firstPrice = (TextView) findViewById(R.id.firstPrice);
    secondPrice = (TextView) findViewById(R.id.secondPrice);
    thirdPrice = (TextView) findViewById(R.id.thirdPrice);

    if("643".equals(currency)) {
        CharSequence firstText = spanWithRoubleTypeface(cityData.getDayPrice() + "₽");
        firstPrice.setText(firstText);
        CharSequence secondText = spanWithRoubleTypeface(cityData.getNightPrice() + "₽");
        secondPrice.setText(secondText);
        CharSequence thirdText = spanWithRoubleTypeface(cityData.getHourPrice() + "₽");
        thirdPrice.setText(thirdText);
    } else if("398".equals(currency)) {
        firstPrice.setText(cityData.getDayPrice()+"\u20B8");
        secondPrice.setText(cityData.getNightPrice()+"\u20B8");
        thirdPrice.setText(cityData.getHourPrice()+"\u20B8");
    }  else if("980".equals(currency)) {
        firstPrice.setText(cityData.getDayPrice()+"\u20B4");
        secondPrice.setText(cityData.getNightPrice()+"\u20B4");
        thirdPrice.setText(cityData.getHourPrice()+"\u20B4");
    } else {
        firstPrice.setText(cityData.getDayPrice());
        secondPrice.setText(cityData.getNightPrice());
        thirdPrice.setText(cityData.getHourPrice());
    }

    offerImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(OfferInfo.this, GalleryActivity.class);
            intent.putStringArrayListExtra("IMAGES", imageGallery);
            startActivity(intent);
        }
    });

    String descriptionFull = cityData.getDescription_full();
    descriptionFull = descriptionFull.replace("<ul>", "");
    descriptionFull = descriptionFull.replace("</ul>", "");
    descriptionFull = descriptionFull.replace("<li>", "");
    descriptionFull = descriptionFull.replace("</li>", "<br />");
    showInWebView(descriptionFull);
    photoButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(OfferInfo.this, PhotoActivity.class);
            intent.putExtra("lat", lat);
            intent.putExtra("lng", lng);
            intent.putExtra("Address", flatAddress);
            startActivity(intent);
        }
    });
}

@Override
protected void onResume() {
    super.onResume();

    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if(resultCode == 0) {
        initializeMap();
    } else {
        Crashlytics.setString("GoogleMap", "Map isn't available, but i'm falling");
        Toast.makeText(this, "Ошибка Google Play Services", Toast.LENGTH_LONG).show();
    }

}

private void initializeMap() {

        if (googleMap == null) {

            final LatLng offerPosition = new LatLng(Double.parseDouble(lat), Double.parseDouble(lng));
            googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(
                    R.id.map)).getMap();
            Marker marker;
            marker = googleMap.addMarker(new MarkerOptions().position(offerPosition));
            marker.setIcon(BitmapDescriptorFactory.defaultMarker(220.0f));

            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(offerPosition, 13));
            googleMap.getUiSettings().setScrollGesturesEnabled(false);
            googleMap.getUiSettings().setMapToolbarEnabled(false);
            googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                @Override
                public boolean onMarkerClick(Marker marker) {
                    Intent intent = new Intent(OfferInfo.this, MapActivity.class);
                    intent.putExtra("lat", lat);
                    intent.putExtra("lng", lng);
                    intent.putExtra("address", flatAddress);
                    intent.putExtra("rooms", cityData.getRoomNumbers());
                    startActivity(intent);
                    return false;
                }
            });
            googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
                @Override
                public void onMapClick(LatLng latLng) {
                    Intent intent = new Intent(OfferInfo.this, MapActivity.class);
                    intent.putExtra("address", flatAddress);
                    intent.putExtra("rooms", cityData.getRoomNumbers());
                    intent.putExtra("lat", lat);
                    intent.putExtra("lng", lng);
                    startActivity(intent);
                }
            });

        }
}

public void showInWebView(String data) {

    webView.loadDataWithBaseURL("", "<html> <style> h3 {margin-bottom:2}</style> <body>" + data + "</body></html>", "text/html", "UTF-8", "");

}

public void showDialog(View v) {

    DialogFragment newFragment = new ContactsDialog();
    Bundle args = new Bundle();
    args.putString("ownerID", ownerID);
    args.putInt("flatsCount", flatsCount);
    args.putString("contactNumber", contactNumber);
    if (!ownerID.equals(userID)) {
        args.putString("userID", userID);
        args.putString("ownerName", ownerName);
    }
    if (skypeName.length() > 0)
        args.putString("skypeName", skypeName);


    newFragment.setArguments(args);
    newFragment.show(this.getFragmentManager(), "missiles");

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_offer_info, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.actionPhoto) {
        Intent intent = new Intent(OfferInfo.this, PhotoActivity.class);
        intent.putExtra("lat", lat);
        intent.putExtra("lng", lng);
        intent.putExtra("Address", flatAddress);
        startActivity(intent);
        return true;
    } else if(item.getItemId() == R.id.home) {

        onBackPressed();
        finish();

    } else if(item.getItemId() == R.id.homeAsUp) {

        onBackPressed();
        finish();

    } else if (item.getItemId() == android.R.id.home) {

        onBackPressed();
        finish();
    }

    return super.onOptionsItemSelected(item);
}

private CharSequence spanWithRoubleTypeface(String priceHint) {
    final Typeface roubleSupportedTypeface =
            Typeface.createFromAsset(getAssets(), "fonts/rouble2.ttf");

    SpannableStringBuilder resultSpan = new SpannableStringBuilder(priceHint);
    for (int i = 0; i < resultSpan.length(); i++) {
        if (resultSpan.charAt(i) == '\u20BD') {
            TypefaceSpan2 roubleTypefaceSpan = new TypefaceSpan2(roubleSupportedTypeface);
            resultSpan.setSpan(roubleTypefaceSpan, i, i + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
    return resultSpan;
}

@Override
public void onConnected(Bundle bundle) {

    try {
        initializeMap();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    if (mResolvingError) {
        return;
    } else if (connectionResult.hasResolution()) {
        try {
            mResolvingError = true;
            connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST);
        } catch (IntentSender.SendIntentException e) {
            mGoogleApiClient.connect();
        }
    } else {
        Toast.makeText(OfferInfo.this, "Обновите Google Play Service", Toast.LENGTH_LONG).show();
        mResolvingError = true;
    }
}
}
k.nadonenko
  • 628
  • 2
  • 7
  • 23

3 Answers3

3

You have a StateListDrawable i.e. a drawable selector resource that seems to refer to itself and hence cause infinite recursion when inflated.

laalto
  • 150,114
  • 66
  • 286
  • 303
  • That's what the 5 repeating entries in the stacktrace tell. Normal drawable resources don't have that many levels of indirection and there is likely a self-reference. I don't have a crystal ball to see which drawable it is. – laalto Apr 28 '15 at 13:35
  • Okay, where should I look then? In code, or in XML? – k.nadonenko Apr 28 '15 at 13:44
  • XML files in your drawable folders. Since it only occurrs on some devices, look for the non-default `drawable-whatever` variants first. – laalto Apr 28 '15 at 13:56
  • Finally I find out where was the problem :D In my custom_button was the recursion to itself :D That's why mdpi devices were crashing, thx mate! – k.nadonenko Apr 30 '15 at 10:33
1

You have an infinite loop somewhere. You should look into your loops or recursive functions.

tasomaniac
  • 10,234
  • 6
  • 52
  • 84
  • if there was an infinite loop the problem occured not only in one device, but on all, and yeah I have no loops inside my activity. – k.nadonenko Apr 28 '15 at 12:49
0

It could be a simple memory problem. Is this an older device? I had the same problem on one of my older devices, simply you need to lower memory consumption and checking what resources you're using. Its hard to say, you should debug your code to see where it fails. Stack overflow can be caused by recursive code but it simply means there's not enough space left.

Also on Android there is a limit to the deepness of the view hierarchy which might cause problems. I havent checked your code but you should check how many levels do you have there. See:

What is the android UI thread stack size limit and how to overcome it?

Community
  • 1
  • 1
breakline
  • 5,776
  • 8
  • 45
  • 84
  • yeah, device is very old, it is Xperia E. Well in some old project I've met the Error about nested layouts, but there stackoverflow said about ViewGroups, but here about drawables. – k.nadonenko Apr 28 '15 at 13:08
  • In my case my problem was that too many images I've displayed. Also on an older Sony device. When you display an ImageView the whole Bitmap gets put into the memory, which might be pretty big depending on the image. – breakline Apr 28 '15 at 13:16