android - 为什么 PreferenceActivity 会抛出 UnsupportedEncodingException?

标签 android

我正在尝试使用 PreferenceActivity 向我的应用程序添加设置(我的目标是 API 级别 8),我一开始只使用了一个复选框:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="pref_fps"
        android:title="FPS"
        android:defaultValue="false" />
</PreferenceScreen>

我的 PreferenceActivity 子类只定义了一个“onCreate”方法:

@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
}

一开始一切似乎都工作正常,但我注意到应用程序重新启动后首选项丢失了。查看日志,似乎首选项无法保存到磁盘。每次我单击 PreferenceActivity 中的复选框时,都会收到此异常:

W/ApplicationContext( 9542): writeFileLocked: Got exception:
W/ApplicationContext( 9542): java.io.UnsupportedEncodingException: utf-8
W/ApplicationContext( 9542):    at com.android.internal.util.FastXmlSerializer.setOutput(FastXmlSerializer.java:297)
W/ApplicationContext( 9542):    at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:181)
W/ApplicationContext( 9542):    at android.app.ContextImpl$SharedPreferencesImpl.writeFileLocked(ContextImpl.java:2928)
W/ApplicationContext( 9542):    at android.app.ContextImpl$SharedPreferencesImpl.access$300(ContextImpl.java:2676)
W/ApplicationContext( 9542):    at android.app.ContextImpl$SharedPreferencesImpl$EditorImpl.commit(ContextImpl.java:2861)
W/ApplicationContext( 9542):    at android.preference.Preference.tryCommit(Preference.java:1198)
W/ApplicationContext( 9542):    at android.preference.Preference.persistBoolean(Preference.java:1403)
W/ApplicationContext( 9542):    at android.preference.CheckBoxPreference.setChecked(CheckBoxPreference.java:154)
W/ApplicationContext( 9542):    at android.preference.CheckBoxPreference.onClick(CheckBoxPreference.java:143)
W/ApplicationContext( 9542):    at android.preference.Preference.performClick(Preference.java:810)
W/ApplicationContext( 9542):    at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:198)
W/ApplicationContext( 9542):    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
W/ApplicationContext( 9542):    at android.widget.ListView.performItemClick(ListView.java:3382)
W/ApplicationContext( 9542):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
W/ApplicationContext( 9542):    at android.os.Handler.handleCallback(Handler.java:587)
W/ApplicationContext( 9542):    at android.os.Handler.dispatchMessage(Handler.java:92)
W/ApplicationContext( 9542):    at android.os.Looper.loop(Looper.java:144)
W/ApplicationContext( 9542):    at android.app.ActivityThread.main(ActivityThread.java:4937)
W/ApplicationContext( 9542):    at java.lang.reflect.Method.invokeNative(Native Method)
W/ApplicationContext( 9542):    at java.lang.reflect.Method.invoke(Method.java:521)
W/ApplicationContext( 9542):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
W/ApplicationContext( 9542):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
W/ApplicationContext( 9542):    at dalvik.system.NativeStart.main(Native Method)
W/ApplicationContext( 9542): Caused by: java.nio.charset.UnsupportedCharsetException: The unsupported charset name is "utf-8".
W/ApplicationContext( 9542):    at java.nio.charset.Charset.forName(Charset.java:544)
W/ApplicationContext( 9542):    at com.android.internal.util.FastXmlSerializer.setOutput(FastXmlSerializer.java:292)
W/ApplicationContext( 9542):    ... 22 more

模拟器和真实设备上的行为是相同的。

我做错了什么?

最佳答案

花了更多时间调试我的应用程序后,我终于发现了问题:我正在使用 native 库,并且该库正在对0x80000000<处的固定内存位置执行mmap/.

在固定位置进行mmap并不是一个好主意。在我们的例子中,它似乎覆盖了应用程序的可用字符集。这就是 PreferenceActivity 无法将文件保存到磁盘的原因。

关于android - 为什么 PreferenceActivity 会抛出 UnsupportedEncodingException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16852622/

相关文章:

android - Timer 是否在后台线程上运行?与 timer.schedule() 的执行不一致

android - sencha touch2.0如何在屏幕间传递数据?

android - 修复 Android Camera 应用的宽高比和旋转

Android:有没有一种简单的方法可以为 View 创建圆角,而不必每次都创建单独的可绘制对象?

android - 测试 RecyclerView 是否有 Espresso 数据

android - 在 Android 中为不同布局分离不同编程逻辑的最佳方法是什么?

android - 使用android kotlin - 随机数显示+延迟问题

android - 在 Facebook Audience Network SDK 5.2.1 版中,我应该使用什么代替 AdIconView?

java - 在android项目中放置并运行apk文件

android - 触摸时可绘制的色调/暗淡