Считается ли плохой практикой чтение из SharedPreferences в цикле while? Всегда ли данные считываются из внутренней/внешней памяти или кэшируются в памяти?
Я делаю это, потому что один из потоков в моих приложениях должен знать, были ли внесены изменения с момента последней итерации.
Ответ 1 · рейтинг 5 · eleven
Это может сработать, но ждать события с помощью цикла while - определенно плохая практика. Чтобы поймать какое-то событие, попробуйте использовать шаблон Observer. Идея этого шаблона состоит в том, чтобы разделить объекты на наблюдателей (ожидание события) и наблюдаемых (регистрация/перехват события и уведомление наблюдателей).
Для этого подхода в Java есть встроенный класс и интерфейс. Пример:
Наблюдаемый:
import java.util.Observable;
public class SharedPrefsWrapper extends Observable{
public static final int EVENT_PUT_STRING = 0;
public void putString(String key, String value){
//put string into shared preferences
//then notify Observers
notifyObservers(EVENT_PUT_STRING);
}
}
Наблюдатель:
import java.util.Observable;
import java.util.Observer;
public class SomeActivity extends Activity implements Observer {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.some_activity);
SharedPrefsWrapper prefs;
//...
prefs.addObserver(this);
}
@Override
public void update(Observable observable, Object event) {
if(event.equals(SharedPrefsWrapper.EVENT_PUT_STRING)){
//event of writing string is caught
}
}
}