活动开始时,某些设备上出现下一个奇怪的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;
}
}
}
答案 0 :(得分:3)
你有一个StateListDrawable
,即一个可绘制的selector
资源,它似乎引用自身,因此在膨胀时会导致无限递归。
答案 1 :(得分:1)
你在某个地方有一个无限循环。你应该研究你的循环或递归函数。
答案 2 :(得分:0)
这可能是一个简单的记忆问题。这是旧设备吗?我在其中一台旧设备上遇到了同样的问题,只需要降低内存消耗并检查您正在使用的资源。很难说,你应该调试你的代码,看看它失败的地方。堆栈溢出可能是由递归代码引起的,但它只是意味着没有足够的空间。
同样在Android上,视图层次结构的深度存在限制,这可能会导致问题。我没有检查你的代码,但你应该检查你有多少级别。参见:
What is the android UI thread stack size limit and how to overcome it?