小编tma*_*dry的帖子

使用PreferenceActivity时刷新Preferences的视图

我正试图强迫PreferenceActivity刷新.有谁知道如何做到这一点?

我有一个ResetDefaultsPreference子类的类Preference,当被点击时,应该重置为默认所有其键以某个前缀开头的首选项.它可以工作,但是当我点击重置偏好时,该屏幕中的所有首选项都不会更新,直到我退出屏幕并返回.(这适用于某些自定义颜色首选项,但即使这样也不适用于某些ListPreferences - 对于那些我必须离开并重新进入PreferenceActivity自身以便显示更新值的人.)

我试图通过获取根视图来解决这个invalidate()问题,但这似乎不起作用.这是刷新显示的行.它是Preference子类的一部分,它保持Context用in创建它mContext.

((Activity)mContext).findViewById(android.R.id.content).invalidate();
Run Code Online (Sandbox Code Playgroud)

在更改和提交首选项值之后会发生这种情况.(值会更改,但显示不会.)有谁知道我如何强制PreferenceActivity自我刷新?

java android

15
推荐指数
1
解决办法
3483
查看次数

堆栈跟踪在到达我的代码之前停止(在使用NDK的Android上)

我正在使用NDK r5b在Android 2.3.x上进行开发.偶尔我的代码会崩溃,我想知道在哪里.当我有一个指针(即来自Android的堆栈跟踪)时,我已经知道如何在我的应用程序中获取相应的行.

但是,我经常看到像这样无用的堆栈跟踪(完整堆栈跟踪):

     #00  pc 0006561a  /system/lib/egl/libGLESv2_adreno200.so
     #01  pc 0006b900  /system/lib/egl/libGLESv2_adreno200.so
     #02  pc 0005aac8  /system/lib/egl/libGLESv2_adreno200.so
     #03  pc 0001687a  /system/lib/egl/libGLESv1_CM_adreno200.so
     #04  pc 000096ce  /system/lib/egl/libGLESv1_CM_adreno200.so
Run Code Online (Sandbox Code Playgroud)

或这个:

(gdb) bt
#0  0xafd0c51c in epoll_wait () from /Volumes/SecureCode/webos/rta/android/obj/local/armeabi/libc.so
#1  0xa81216a6 in ?? ()
Run Code Online (Sandbox Code Playgroud)

根本没有提到我的代码.

有没有办法获得比这更好的堆栈跟踪?为什么某些库函数"不透明",因为它们不允许回溯"透视"到调用函数,导致堆栈跟踪中的停止?

据我所知,调试这样的问题的唯一方法是在程序中的每个点使用日志记录和/或使用gdb逐步执行每一行.

是否有ROM可用于这些Android库的调试版本而不是运行时库,这会有帮助吗?(我只使用一部手机进行开发,所以我不担心保持全部功能.)(实际上,我注意到libc.so上面gdb堆栈跟踪的路径在我的应用程序目录中.我可能只是用不同的方式打包它(调试)libc.so,那会有帮助吗?)

最后一件事可能有所帮助:在logcat(第一个)的上述堆栈跟踪中,我的库在原始堆栈转储中被提及:

stack:
  ...
  ...
  4471cb88  00000028  
  4471cb8c  afd4649c  
  4471cb90  80b4eb71  /data/data/com.audia.dev.rta/lib/librta.so
  4471cb94  00299180  
  ...
  ...
Run Code Online (Sandbox Code Playgroud)

但那不是函数指针.可能是什么,在应用程序崩溃后会有任何帮助吗?我猜它可能不是,如果它是一个堆指针或类似的东西.

c++ android gdb android-ndk

11
推荐指数
1
解决办法
3370
查看次数

Android NDK代码中的SIGILL

我在市场上有一个NDK应用程序,并获得有关SIGILL信号的本机崩溃报告.(我使用google breakpad生成本机崩溃报告.)以下是详细信息:

  • 我的应用程序被编译为armeabi-v7a, NEON支持.
  • 它在NVIDIA Tegra 2处理器上崩溃,这是ARM-7(Cortex-A9).
  • 它每次都会发生.(联系用户)
  • 崩溃地址是0x399cc,信号是SIGILL,并且它在我的代码中.

登记和拆卸:

 r4 = 0x001d50f0    r5 = 0x001d50f0    r6 = 0x598e2a3c    r7 = 0x00000000
 r8 = 0x00000001    r9 = 0x001c22b0   r10 = 0x00000000    fp = 0x81216264
 sp = 0x598e2a18    lr = 0x816399cb    pc = 0x816399cc

0x000399c6 <_ZN8Analyzer15setExpAvgFactorEi+22>:    blx 0x30508
0x000399ca <_ZN8Analyzer15setExpAvgFactorEi+26>:    fconstd d16, #7
0x000399ce <_ZN8Analyzer15setExpAvgFactorEi+30>:    vldr    d17, [pc, #32]  ; 0x399f2 <_ZN8Analyzer15setExpAvgFactorEi+66>
Run Code Online (Sandbox Code Playgroud)

这里有完整的源代码和汇编程序(很简单,基本上是2行C++.)

你可以看到它0x399ccfconstd指令的中间.根据arm.com的说法添加了这个指令VFP-v3 …

c++ assembly android arm android-ndk

10
推荐指数
1
解决办法
4009
查看次数

为什么我不能通过其IP访问我的Kubernetes服务?

我在GKE上有一个Kubernetes服务如下:

$ kubectl describe service staging
Name:           staging
Namespace:      default
Labels:         <none>
Selector:       app=jupiter
Type:           NodePort
IP:             10.11.246.27
Port:           <unnamed>   80/TCP
NodePort:       <unnamed>   31683/TCP
Endpoints:      10.8.0.33:1337
Session Affinity:   None
No events.
Run Code Online (Sandbox Code Playgroud)

我可以直接通过其中一个端点(10.8.0.21:1337)或通过节点端口(10.240.251.174:31683在我的情况下)从VM访问服务.但是,如果我尝试访问10.11.246.27:80,我什么也得不到.我也尝试过端口1337和31683.

为什么我不能通过其IP访问服务?我需要防火墙规则吗?

google-compute-engine kubernetes google-kubernetes-engine

7
推荐指数
1
解决办法
3067
查看次数

Android自定义偏好值未保存

我正在尝试使用现有的Preference子类来保存颜色值.我没有编写类,但它应该在android-7及更高版本上工作(我正在编译为android-9目标.)完整的源代码可以在这里找到.这是保存首选项的位置:

@Override
public void onColorChanged(int color) {
    if (isPersistent()) {
        boolean ret = persistInt(color);
    }
    // (update preview box, other stuff)
}
Run Code Online (Sandbox Code Playgroud)

使用调试输出我可以告诉isPersistent()返回true,但persistInt()返回false.根据Android文档,persistInt()返回首选项是否持久; 这些如何回归不同的价值?(注意:setPersistent(true)从构造函数中显式调用.)

在任何情况下,都不会保存该值.一个调用getPersistedInt(defaultValue)返回默认值,甚至稍后在同一个类的实例中.在下面的代码中,getPersistedInt()始终调用并始终返回mDefaultValue.

public int getValue() {
    try {
        if (isPersistent()) {
            mValue = getPersistedInt(mDefaultValue);
        }
    } catch (ClassCastException e) {
        mValue = mDefaultValue;
    }

    return mValue;
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样,我怎样才能确保首选项保持不变?

java android

6
推荐指数
1
解决办法
2592
查看次数

绘制太多元素时glDrawArrays()会出现段错误

我在C++中有一些简单的OpenGL ES代码,我在运行Android的手机,运行webOS的手机和使用SDL/OpenGL的Mac上运行.有问题的代码只是绘制了一个GL_LINE_STRIP存储在GLfloats 数组中的代码.以下是我尝试这样做的方法(版本1):

GLfloat array* = new GLfloat[2048];
//later... (array gets filled)
int howMany = 1024;
glVertexPointer(2, GL_FLOAT, 0, array); checkError();
glDrawArrays(GL_LINE_STRIP, 0, howMany); checkError();
Run Code Online (Sandbox Code Playgroud)

似乎它应该非常简单.但是,上面的代码段落在Android和我的Mac上的OpenGL驱动程序中(无论出于何种原因,似乎在webOS上运行正常.)这是我要做的就是避免这种情况(版本2):

GLfloat array* = new GLfloat[2048];
//later... (array gets filled)
int howMany = 1024;
for (unsigned i = 0; i < howMany; i += 789) {
    glVertexPointer(2, GL_FLOAT, 0, array+i*2); checkError();
    //this is not a bug: we draw one more than we increment by, or there is …
Run Code Online (Sandbox Code Playgroud)

opengl android opengl-es android-ndk

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