gpt4 book ai didi

android - 更改共享首选项后更新 UI 时应用程序崩溃

转载 作者:行者123 更新时间:2023-11-30 03:41:48 25 4
gpt4 key购买 nike

在我的 Activity 的 onCreate 方法中,我注册了一个 onSharedPreferenceChangeListener。 Activity 本身实现了 OnSharedPreferenceChangeListener。

当偏好更新时,调用以下方法。

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if(key.equals(Configuration.PREF_TIMETABLE_UPDATING)){
resetView();
}

}

public void resetView(){
this.container.removeAllViews();
}

此代码会在某个属性更新后从容器 View 中删除所有 View 。它适用于我的 Android 4 设备,但在我的 Android 2.2.1 设备上应用程序崩溃:

03-24 16:09:00.054: E/AndroidRuntime(1712): FATAL EXCEPTION: AsyncTask #5
03-24 16:09:00.054: E/AndroidRuntime(1712): java.lang.RuntimeException: An error occured while executing doInBackground()
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.os.AsyncTask$3.done(AsyncTask.java:200)
03-24 16:09:00.054: E/AndroidRuntime(1712): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
03-24 16:09:00.054: E/AndroidRuntime(1712): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
03-24 16:09:00.054: E/AndroidRuntime(1712): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
03-24 16:09:00.054: E/AndroidRuntime(1712): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-24 16:09:00.054: E/AndroidRuntime(1712): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
03-24 16:09:00.054: E/AndroidRuntime(1712): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
03-24 16:09:00.054: E/AndroidRuntime(1712): at java.lang.Thread.run(Thread.java:1102)
03-24 16:09:00.054: E/AndroidRuntime(1712): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.view.ViewRoot.checkThread(ViewRoot.java:2824)
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.view.ViewRoot.requestLayout(ViewRoot.java:598)
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.view.View.requestLayout(View.java:8126)
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.view.View.requestLayout(View.java:8126)
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.view.View.requestLayout(View.java:8126)
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.view.View.requestLayout(View.java:8126)
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.widget.ScrollView.requestLayout(ScrollView.java:1200)
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.view.View.requestLayout(View.java:8126)
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.view.ViewGroup.removeAllViews(ViewGroup.java:2263)
03-24 16:09:00.054: E/AndroidRuntime(1712): at com.example.TimetableActivity.resetView(TimetableActivity.java:430)
03-24 16:09:00.054: E/AndroidRuntime(1712): at com.example.TimetableActivity.onSharedPreferenceChanged(TimetableActivity.java:557)
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.app.ContextImpl$SharedPreferencesImpl$EditorImpl.commit(ContextImpl.java:2869)
03-24 16:09:00.054: E/AndroidRuntime(1712): at com.example.MyHelper.setTimetableUpdate(MyHelper.java:145)
03-24 16:09:00.054: E/AndroidRuntime(1712): at com.example.webservice.task.LessonFetcherTask.doInBackground(LessonFetcherTask.java:33)
03-24 16:09:00.054: E/AndroidRuntime(1712): at com.example.webservice.task.LessonFetcherTask.doInBackground(LessonFetcherTask.java:1)
03-24 16:09:00.054: E/AndroidRuntime(1712): at android.os.AsyncTask$2.call(AsyncTask.java:185)
03-24 16:09:00.054: E/AndroidRuntime(1712): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-24 16:09:00.054: E/AndroidRuntime(1712): ... 4 more

如何确保 OnSharedPreferenceChangeListener 调用的方法在 UI 线程上运行?非常感谢任何有关如何解决此问题的帮助!

最佳答案

问题是你以某种方式徘徊在一个新线程上:

Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

确保 UI 命令在 UI 线程上的一种方法是使用 UI 处理程序。 (这并不像听起来那么难。)只需将 removeViews() 放入 Runnable 中,然后在任何 View 上使用 post()。像这样:

创建一个可运行的:

Runnable runnable = new Runnable() {
@Override
public void run() {
resetView();
}
};

将其发布到 UI 线程:

if(key.equals(Configuration.PREF_TIMETABLE_UPDATING)){
container.post(runnable);
}

关于android - 更改共享首选项后更新 UI 时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15600394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com