Android页面显示自动加载更新
2011-09-14 14:33
471 查看
这是转行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();
}
注意,观察者模式的数据操作类必须是单实例
当一个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();
}
注意,观察者模式的数据操作类必须是单实例
相关文章推荐
- 页面加载时显示日期时间星期几并自动更新
- Android 自动更新APP时确定安装后没有显示安装完成页面
- Android实现TextView走马灯效果同时自动更新显示当前时间
- 解决Android IED自动加载函数形参显示为arg0,arg1的问题
- android webView加载页面时显示出全部网页内容
- 安卓自动更新,静默更新,替换友盟更新可以在通知栏里显示更新下载进度,几行代码快速实现Android下载更新
- Android软键盘(输入法)使用大杂烩:避免进入页面EditText自动弹出软键盘-2013.11.08更新
- Android软键盘(输入法)使用大杂烩:避免进入页面EditText自动弹出软键盘-2013.11.08更新
- android 页面加载自动到顶部
- android之apk自动更新采用Notification通知提示并显示下载进度
- Android 使用RxJava+Retrofit +Realm 组合加载数据 <读取缓存 显示 请求网络数据 缓存最新数据 更新界面>(一)
- android 自动更新APP版本,并使用ProgressDialog显示进度
- android开发进行自动更新时怎么下载软件到手机内存,显示实现下载到SD卡了
- Android软件自动更新,通知栏显示,项目源码
- Android 通过蒲公英pgyer的接口 Service 实现带进度下载App 通知栏显示 在线更新 自动更新Demo
- android快速开发框架--快速实现 页面 加载中 加载失败 无数据等状态以及下拉刷新和自动加载
- 页面刚开始加载时文本框显示1,2(从1自动后增)的sql语句
- Android切换系统语言,自动更新应用界面显示语言
- 【Android】WebView加载https页面不能正常显示资源问题
- Android webView加载html页面不显示(显示白屏)