Плохая практика чтения SharedPreferences в цикле while?

Считается ли плохой практикой чтение из SharedPreferences в цикле while? Всегда ли данные считываются из внутренней/внешней памяти или кэшируются в памяти?

Я делаю это, потому что один из потоков в моих приложениях должен знать, были ли внесены изменения с момента последней итерации.


person Cethy    schedule 26.10.2013    source источник
comment
Я считаю, что доступ всегда будет идти к IO. Вы всегда можете протестировать его с помощью StrictMode и посмотреть, есть ли значительное влияние. .   -  person oxygenpt    schedule 26.10.2013


Ответы (2)


Это может сработать, но ждать события с помощью цикла 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
        }
    }
}
person eleven    schedule 26.10.2013

Цикл while здесь определенно нежелателен.

Вместо этого используйте registerOnSharedPreferenceChangeListener с помощью SharedPreferences.OnSharedPreferenceChangeListener для прослушивания изменений. Как упоминалось в других ответах, это работает в потоках в одном и том же приложении (например, служба может прослушивать изменения, внесенные действием), но не в разных приложениях.

person quietmint    schedule 26.10.2013