在while循环中读取SharedPreferences是不是一种错误的做法?数据是始终从内部/外部存储读取,还是缓存在内存中?
我这样做是因为我的应用程序中的一个线程需要知道自上次迭代以来是否进行了更改。
答案 0 :(得分:5)
它可能有效,但使用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
}
}
}
答案 1 :(得分:2)
这里绝对不需要while循环。
相反,请使用registerOnSharedPreferenceChangeListener和SharedPreferences.OnSharedPreferenceChangeListener来监听更改。正如其他答案中所提到的,这适用于同一应用程序中的线程(例如,服务可以侦听活动所做的更改),但不适用于不同的应用程序。