小编ben*_*nkc的帖子

暂停时onClick或onItemClick会导致"IllegalStateException:onSaveInstanceState后无法执行此操作"

我有一个TabActivity主机5倍FragmentActivity.其中一些包含按钮或列表,在其中onClick()onItemClick()创建和推送新片段.

在大多数情况下,这工作正常,但如果事情有点反应迟钝,或者测试人员做了一些愚蠢的事情(按住按钮或列表项,使用不同的手指切换标签,然后释放按钮/列表 - 100%可重复),我在活动暂停并保存后很快得到点击事件.请参阅日志片段:

10-30 17:05:16.258  3415  3415 D BKC DEBUG: More.onSaveInstanceState()
10-30 17:05:16.258  3415  3415 D BKC DEBUG: MoreFragment.onPause()
10-30 17:05:17.309  3415  3415 D BKC DEBUG: MoreFragment.onItemClick()
Run Code Online (Sandbox Code Playgroud)

在阅读了本文以及有关片段状态丢失的各种StackOverflow问题后,我没有看到如何解决这个问题的好答案.

  • 运用 commitAllowingStateLoss()(无条件)是一种可以隐藏真正错误的解决方法.
  • 我不确定取消注册OnClickListeners和OnItemClickListeners onSaveInstanceState会100%防止这种情况,对于每个片段中的每个按钮来说,它都是PITA.
  • 有人建议检查相关片段 isAdded(),但我可以确认这不起作用.
  • 我可以设置一个标志,onSaveInstanceState()onRestoreInstanceState()在onClick()中检查,但再次,这只是一个kludge.编辑:哦,片段没有onRestoreInstanceState(),但我可以旋转国旗onResume()或其他什么.

是否有一个正确的解决方案,我错过了,或者我应该选择我的kludge?

android android-fragments

13
推荐指数
1
解决办法
1655
查看次数

Android JNI:root-caused deadd00d(dvmAbort)

对一些StackOverflow问题的评论指出,deadd00d的故障地址表示故意的VM中止.

I DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
Run Code Online (Sandbox Code Playgroud)

事实上,当通过ndk-stack运行日志时,我看到堆栈帧的顶部解码为:

Stack frame #00  pc 00050b0e  /system/lib/libdvm.so (dvmAbort)
Run Code Online (Sandbox Code Playgroud)

然后评论说要在日志中查看问题.究竟我在寻找什么 - 是否有特定的标签或字符串可供搜索?(也许dalvikvm?)我滚动了很多页面的日志而没有找到任何相关的东西 - 这是正常的,还是应该在故障发生之前?

deadd00d最常发生在对GetObjectClass()的特定调用中.我试过在该行之前立即调用env-> ExceptionCheck,但它没有报告任何先前的错误.

我也试过打开CheckJNI

adb shell setprop debug.checkjni 1
Run Code Online (Sandbox Code Playgroud)

根据此处此处的说明,但在杀死并重新启动应用程序时,我看不到预期的消息

D Late-enabling CheckJNI
Run Code Online (Sandbox Code Playgroud)

反而

D AndroidRuntime: CheckJNI is OFF
Run Code Online (Sandbox Code Playgroud)

使用adb shell getprop表明该物业真的开启了,所以我不确定那里发生了什么.

java-native-interface android

8
推荐指数
1
解决办法
2158
查看次数

Parcel.readException中的NullPointerException(等)

看起来像这样的例外令人困惑:

FATAL EXCEPTION: main
java.lang.NullPointerException
    at android.os.Parcel.readException(Parcel.java:1437)
    at android.os.Parcel.readException(Parcel.java:1385)
    at com.yourpackage.ipc.IYourClass$Stub$Proxy.yourMethod(IYourClass.java:488)
    at com.yourpackage.ipc.YourClassShim.yourMethod(YourClassShim.java:269)
Run Code Online (Sandbox Code Playgroud)

我找到了一堆相关的问题,但没有一个回答"你如何调试这个".所以我正在提出这个问题/答案.

通过查看这里这里的android源代码,你会看到它可以抛出任何这些(NullPointerException就是我所拥有的):

SecurityException(msg);
BadParcelableException(msg);
IllegalArgumentException(msg);
NullPointerException(msg);
IllegalStateException(msg);
RuntimeException("Unknown exception code: " + code + " msg " + msg);
Run Code Online (Sandbox Code Playgroud)

但究竟是什么导致了这些?

android parcel

8
推荐指数
1
解决办法
1万
查看次数

如何使用Android NDK为缺少的return语句启用编译错误

使用Android NDK,我有一个返回作业的本机方法 - 除了我忘记了return语句.不幸的是,这个编译没有警告,当我试图运行它时,只给了我一个0xdeadd00d的段错误.

虽然我最近主要在Java工作,所以我脑子里的错误信息是"缺少return语句",我相信gcc错误信息是"控制到达非void函数的结尾".

我想打开警告,并将其变成错误.我怎么做?(-Wall -Werror由于我正在编译的现有代码库,简单地使用不是一个选项.)

gcc compiler-errors android-ndk

2
推荐指数
1
解决办法
1379
查看次数

C ++错误:此上下文中不允许分解声明

为什么g++给出这样的错误?

blahblah.h:80:10: error: decomposition declaration not permitted in this context
float[NUM_OUTPUTS] output_buffer;
Run Code Online (Sandbox Code Playgroud)

(已经解决,但是创建它是因为该错误文本没有良好的Google匹配,并且错误消息难以理解。)

c++ g++

2
推荐指数
1
解决办法
1321
查看次数