您的位置:首页 > 移动开发 > Android开发

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();

    }

注意,观察者模式的数据操作类必须是单实例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐