这是转行Android的第一篇文章,希望以后能坚持住,呵呵
当一个ListView界面上显示的内容数据在后台发生改变时,怎么才能同步的更新呢。好比ListView显示的是用户安装的程序列表,当有新的程序安装时,如何才能立即加载。或者是显示拦截信息的界面,当有新的信息被拦截时,如何能及时的更新界面。这里用到就是典型的观察者模式,需要得知数据增删改的界面都要注册数据操作的类,在数据操作的同时就会向注册自己的UI发送改变的信息。
以短信拦截的模块为例子,数据操作类MsgLogAction
interface MsgLogObserver{
/**
* 当有MsgLog增加是调用
* @param msgLog
*/
void onMsgLogAdd(MsgLog msgLog);
/**
* 当有MsgLog删除时调用
* @param msgLog
*/
void onMsgLogRemove(MsgLog msgLog);
/**
* 当有MsgLog改变时调用
* @param msgLog
*/
void onMsgLogUpdate(MsgLog msgLog);
}
private DBOpenHelper dbOpenHelper;
private List<WeakReference<MsgLogObserver>> mObservers;
private static MsgLogAction _instance;
public static void instantiate(Application application) {
_instance = new MsgLogAction(application);
}
public static MsgLogAction getInstance() {
return _instance;
}
public MsgLogAction(Context context){
dbOpenHelper = new DBOpenHelper(context);
mObservers = new ArrayList<WeakReference<MsgLogObserver>>();
}
private void cleanObserverCache() {
for (int i=0; i<mObservers.size(); i++) {
MsgLogObserver ob = mObservers.get(i).get();
if (ob == null) {
mObservers.remove(i);
i--;
}
}
}
public void registerObserver(MsgLogObserver observer) {
cleanObserverCache();
for (int i=0; i<mObservers.size(); i++) {
MsgLogObserver ob = mObservers.get(i).get();
if (ob == null) {
mObservers.remove(i);
i--;
}
}
WeakReference<MsgLogObserver> wr = new WeakReference<MsgLogObserver>(observer);
mObservers.add(wr);
}
/**
* 添加电话日志
*/
public synchronized void save(MsgLog msg){
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.insert(MsgLog.TABLENAME, null, msg.toContentValues());
cleanObserverCache();
for(int i = 0; i<mObservers.size();i++){
mObservers.get(i).get().onMsgLogAdd(msg);
}
}
/**
* 删除
*/
public synchronized void delete(MsgLog msg){
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.delete(MsgLog.TABLENAME, "id=?", new String[]{msg.getId()+""});
cleanObserverCache();
for(int i = 0; i<mObservers.size();i++){
mObservers.get(i).get().onMsgLogRemove(msg);
}
}
/**
* 修改MsgLog
*/
public synchronized void update(MsgLog msg){
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.update(MsgLog.TABLENAME, msg.toContentValues(), "id=?", new String[]{msg.getId()+""});
cleanObserverCache();
for(int i = 0; i<mObservers.size();i++){
mObservers.get(i).get().onMsgLogUpdate(msg);
}
}
这样一来当数据库发生增删改改变时,其中注册的实现MsgLogObserver接口的类就会相应的调用OnMsgLogAdd,OnMsgLogRemove,OnMsgLogUpdate方法。
在列表Activity里的OnCreate()方法里MsgLogAction msgLogAction = MsgLogAction.getInstance(); msgLogAction.registerObserver(this);
此类在实现MsgLogObserver接口,实现其方法。在里面就可以刷新界面了
public void onMsgLogAdd(MsgLog msgLog) {
loadLogList();
}
public void onMsgLogRemove(MsgLog msgLog) {
loadLogList();
}
public void onMsgLogUpdate(MsgLog msgLog) {
loadLogList();
}
注意,观察者模式的数据操作类必须是单实例
浙公网安备 33010602011771号