在 while 循环中读取 SharedPreferences 是否被认为是不好的做法?数据是始终从内部/外部存储中读取,还是缓存在内存中?
我这样做是因为我的应用程序中的一个线程需要知道自上次迭代以来是否进行了更改。
在 while 循环中读取 SharedPreferences 是否被认为是不好的做法?数据是始终从内部/外部存储中读取,还是缓存在内存中?
我这样做是因为我的应用程序中的一个线程需要知道自上次迭代以来是否进行了更改。
它可能有效,但使用 while 循环等待事件绝对是不好的做法。要捕获某些事件,请尝试使用观察者模式。这种模式的思想是将对象拆分为观察者(等待事件)和可观察的(注册/捕获事件并通知观察者)
这种方法在 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
}
}
}
while 循环在这里绝对是不可取的。
相反,使用带有SharedPreferences.OnSharedPreferenceChangeListener的registerOnSharedPreferenceChangeListener来监听更改。正如在其他答案中提到的,这适用于同一应用程序中的线程(例如,服务可以侦听活动所做的更改),但不适用于不同的应用程序。