我在使用Galaxy S系列时遇到了一些麻烦,展示视图在任何其他设备上都能完美无缺,但我在Galaxy S设备上遇到以下错误。
java.lang.OutOfMemoryError: Failed to allocate a 5760012 byte allocation with 3573238 free bytes and 3MB until OOM at dalvik.system.VMRuntime.newNonMovableArray(VMRuntime.java) at android.graphics.BitmapFactory.nativeDecodeAsset(BitmapFactory.java)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:726)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:547)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1014)
at android.content.res.Resources.loadDrawableForCookie(Resources.java:3747)
at android.content.res.Resources.loadDrawable(Resources.java:3620) at android.content.res.Resources.getDrawable(Resources.java:1852) at android.support.v4.content.res.ResourcesCompatApi21.getDrawable(ResourcesCompatApi21.java)
at android.support.v4.content.res.ResourcesCompat.getDrawable(ResourcesCompat.java)
at com.github.amlcurran.showcaseview.StandardShowcaseDrawer.(StandardShowcaseDrawer.java)
at com.github.amlcurran.showcaseview.ShowcaseView.(ShowcaseView.java)
at com.github.amlcurran.showcaseview.ShowcaseView.(ShowcaseView.java)
at com.github.amlcurran.showcaseview.ShowcaseView$Builder.(ShowcaseView.java)
at com.github.amlcurran.showcaseview.ShowcaseView$Builder.(ShowcaseView.java)
at br.com.mygas.myapplication.MainActivity.showcase(MainActivity.java)
at br.com.mygas.myapplication.MainActivity.access$300(MainActivity.java)
at br.com.mygas.myapplication.MainActivity$5.onShowcaseViewDidHide(MainActivity.java)
at com.github.amlcurran.showcaseview.ShowcaseView$2.onAnimationEnd(ShowcaseView.java)
at com.github.amlcurran.showcaseview.AnimatorAnimationFactory$2.onAnimationEnd(AnimatorAnimationFactory.java)
at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1089)
at android.animation.ValueAnimator$AnimationHandler.doAnimationFrame(ValueAnimator.java:666)
at android.animation.ValueAnimator$AnimationHandler.run(ValueAnimator.java:682)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
at android.view.Choreographer.doCallbacks(Choreographer.java:590) at
android.view.Choreographer.doFrame(Choreographer.java:559) at
android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
at android.os.Handler.handleCallback(Handler.java:739) at
android.os.Handler.dispatchMessage(Handler.java:95) at
android.os.Looper.loop(Looper.java:145) at
android.app.ActivityThread.main(ActivityThread.java:5942) at
java.lang.reflect.Method.invoke(Method.java) at
java.lang.reflect.Method.invoke(Method.java:372) at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
private void showcase() {
if (SaveSharedPreference.isMainActivity(this)) {
switch (counter) {
case 0:
new ShowcaseView.Builder(this)
.withMaterialShowcase()
.setContentTitle("Esta é a tela inicial:")
.setStyle(R.style.CustomShowcaseThemeNext)
.setShowcaseEventListener(new SimpleShowcaseEventListener() {
@Override
public void onShowcaseViewDidHide(ShowcaseView showcaseView) {
counter++;
showcase();
}
})
.build();
break;
case 1:
new ShowcaseView.Builder(this)
.setContentTitle("Selecione o tipo de combustível:")
.setTarget(new ViewTarget(R.id.spinner, this))
.setShowcaseDrawer(new CustomShowcaseView(this, findViewById(R.id.spinner).getWidth(), findViewById(R.id.spinner).getHeight()))
.setShowcaseEventListener(new SimpleShowcaseEventListener() {
@Override
public void onShowcaseViewDidHide(ShowcaseView showcaseView) {
counter++;
showcase();
}
})
.build();
break;
case 2:
new ShowcaseView.Builder(this)
.withMaterialShowcase()
.setTarget(new ViewTarget(R.id.fab2, this))
.setContentTitle("Clique neste botão para procurar combustível ao redor:")
.setStyle(R.style.CustomShowcaseThemeNext)
.setShowcaseEventListener(new SimpleShowcaseEventListener() {
@Override
public void onShowcaseViewDidHide(ShowcaseView showcaseView) {
counter++;
showcase();
}
})
.build();
break;
case 3:
new ShowcaseView.Builder(this)
.withMaterialShowcase()
.setTarget(new ViewTarget(R.id.fab2, this))
.setContentTitle("Lembre-se:")
.setContentText("É necessário estar com o GPS ligado")
.setStyle(R.style.CustomShowcaseTheme2)
.setShowcaseEventListener(new SimpleShowcaseEventListener() {
@Override
public void onShowcaseViewDidHide(ShowcaseView showcaseView) {
counter++;
showcase();
}
})
.build();
SaveSharedPreference.mainActivityFirst(this);
break;
}
}
}
我无法弄清楚错误来自何处寻找任何建议。
答案 0 :(得分:0)
OutOfMemoryError 是android中最常见的问题,尤其是在处理位图时。当由于内存空间不足而无法分配对象时,Java虚拟机(JVM)会抛出此错误,垃圾收集器也无法释放一些空间。
磁盘上文件的大小不一定与内存中文件的大小一致。文件可能会被压缩,而这些文件在解码时不会被压缩。您需要在计算中考虑到这一点。
您可以参考how to load bitmaps efficiently?上的这篇文章 How to load large bitmaps efficiently?
虽然使用 android:largeHeap="true"
这不是一个好主意,但谷歌的摘录解释了它,
但是,请求大堆的功能仅适用于a 一小组应用程序,可以证明需要消耗更多的RAM(例如 作为一个大型照片编辑应用程序)。永远不要简单地请求大堆 因为你已经没有内存而你需要快速修复 - 你应该这样做 只有当你确切知道所有记忆的存在时才使用它 分配以及必须保留的原因。然而,即使你有信心 你的应用程序可以证明大堆的合理性,你应该避免请求它 尽可能的。使用额外的内存将越来越多 因为垃圾而损害整体用户体验 收集将花费更长时间,系统性能可能会更慢 任务切换或执行其他常见操作。
这里是文档的完整链接 https://developer.android.com/training/articles/memory.html
但是,您可以尝试在andriod清单文件中设置并运行。
答案 1 :(得分:0)
解决了从ShowcaseView.java更改方法隐藏的问题 由此:
@Override
public void hide() {
// If the type is set to one-shot, store that it has shot
shotStateStore.storeShot();
mEventListener.onShowcaseViewHide(this);
fadeOutShowcase();
}
对此:
@Override
public void hide() {
// If the type is set to one-shot, store that it has shot
clearBitmap();
shotStateStore.storeShot();
mEventListener.onShowcaseViewHide(this);
fadeOutShowcase();
}