Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: CethyОтветов: 2

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

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

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

androidsharedpreferenceswhile-loopperformance

Ответы

Ответ 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
        }
    }
}

Ответ 2 · рейтинг 2 · quietmint

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы