2013-03-24 4 views
1

В методе onCreate моей деятельности зарегистрирован onSharedPreferenceChangeListener. Сама операция реализует OnSharedPreferenceChangeListener.Ошибка приложения при обновлении пользовательского интерфейса после изменения общих настроек

Когда настройки обновляются, вызывается следующий метод.

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

} 

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

Этот код удаляет все виды из вида контейнера после того, как определенное свойство было обновлено. Он работает все в порядке с моими 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 работает в потоке пользовательского интерфейса? Любая помощь в том, как исправить это, будет очень признательна!

ответ

1

Проблема заключается в том, что каким-то образом вы блуждали на новую тему:

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

Одним из способов обеспечения команд пользовательского интерфейса находятся на UI Thread является использование интерфейса обработчика. (Это не так сложно, как кажется). Просто поставьте removeViews() внутри Runnable и используйте post() на любом представлении. Как так:

Создать Runnable:

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

Сообщение это к UI Тема:

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

Спасибо большое, это решить мою проблему! :) –

Смежные вопросы