Android StackOverflowError

时间:2015-04-28 12:43:28

标签: java android stack-overflow

活动开始时,某些设备上出现下一个奇怪的stackoverflow错误:

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}

首先我认为问题出在Google Play服务中,但现在我无法找出问题所在。 我也提供我的活动代码:

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;
    }
}
}

3 个答案:

答案 0 :(得分:3)

你有一个StateListDrawable,即一个可绘制的selector资源,它似乎引用自身,因此在膨胀时会导致无限递归。

答案 1 :(得分:1)

你在某个地方有一个无限循环。你应该研究你的循环或递归函数。

答案 2 :(得分:0)

这可能是一个简单的记忆问题。这是旧设备吗?我在其中一台旧设备上遇到了同样的问题,只需要降低内存消耗并检查您正在使用的资源。很难说,你应该调试你的代码,看看它失败的地方。堆栈溢出可能是由递归代码引起的,但它只是意味着没有足够的空间。

同样在Android上,视图层次结构的深度存在限制,这可能会导致问题。我没有检查你的代码,但你应该检查你有多少级别。参见:

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