首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android历史内容观察者

Android历史内容观察者
EN

Stack Overflow用户
提问于 2013-05-20 06:26:25
回答 2查看 2.2K关注 0票数 5

我实现了历史的内容观察者,但是它在历史上的每一个变化都是运行weird.For的,它的onChange()函数运行3-5次。

代码语言:javascript
运行
复制
static class BrowserOberser extends ContentObserver {
    public BrowserOberser() {
        super(null);
    }

    @Override
    public boolean deliverSelfNotifications() {
        return true;
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Log.d("History", "onChange: " + selfChange);
    }

}

我还注册了我的观察员

代码语言:javascript
运行
复制
BrowserOberser observer = new BrowserOberser();
getApplication().getContentResolver().registerContentObserver(Browser.BOOKMARKS_URI, true, observer );

并在清单中添加了必需的权限。

代码运行良好,但onChange();对历史记录中的每个更改运行3-5次

有人能帮我解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-27 05:07:15

这就是我最终解决问题的方法--至少是这样(我想在历史发生变化的时候阅读历史)。

代码语言:javascript
运行
复制
    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        /**
         * Get SharedPreferneces of the user
         */
        SharedPreferences pref= myContext.getSharedPreferences("com.tpf.sbrowser", 
                Context.MODE_PRIVATE);
        long wherelong = pref.getLong("Date", 0);
        DatabaseManager db=new DatabaseManager(myContext,1);
        String[] proj = new String[] { Browser.BookmarkColumns.TITLE,
                Browser.BookmarkColumns.URL, BookmarkColumns.DATE,};
        String sel = Browser.BookmarkColumns.BOOKMARK + " = 0"; 
        Cursor mCur = myContext.getContentResolver().query(
                Browser.BOOKMARKS_URI, proj, sel, null, null);
        Log.d("onChange", "cursorCount"+mCur.getCount());
        mCur.moveToFirst(); 
        String title = ""; 
        String url = ""; 
        long lastVisitedDate=0;
        DbMessage msg = new DbMessage(lastVisitedDate,url, title);
        /**
         * Start reading the user history and dump into database
         */
        if(mCur.moveToFirst() && mCur.getCount() > 0) { 
              while (mCur.isAfterLast() == false) {
                  title =mCur.getString(0); 
                  url = mCur.getString(1); 
                  lastVisitedDate =mCur.getLong(2); 
                  if ((lastVisitedDate>wherelong) && (!title.equals(url))) {
                      msg.set(lastVisitedDate, url, title);
                      db.InsertWithoutEnd(msg);
                      pref.edit().putBoolean("BrowserHistoryRead", true).commit();
                      pref.edit().putLong("Date", lastVisitedDate).commit();
                      myContext.updateTime(wherelong,lastVisitedDate);
                      wherelong=lastVisitedDate;
                  }
                  mCur.moveToNext(); 
              } 
          }
    }

但是,如果有人能够判断onChange的哪个迭代(在简单的问题代码中)与页面加载中的确切状态相对应,那就更好了。据我所知,在第一次迭代中,标题与url相同,在第三次迭代中,出现了正确的页面标题。但在重定向过程中,onChange被打了5次电话。那么,有人能确认哪一个迭代序列响应到哪个阶段吗?

票数 2
EN

Stack Overflow用户

发布于 2015-05-06 09:15:54

我想我会找到答案的。首先,我想说我的英语是有限的,我希望你能理解我。

事实上,对于历史上的每一个变化,onChange();运行了几次,至少两次。

因为当用户使用浏览器浏览网站时,系统会在数据库中添加历史记录,然后调用onChange();。但现在系统还不知道网址的名称。当系统获得网址的标题后,系统对数据库进行更新,并调用onChange();

而且,如果url在此期间重定向,则每次系统获得新的url时,系统也会更新数据库,因此onChange();也会被调用。因此,我认为每次更改都会调用onChange几次。希望你能听懂我的英语。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16643744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档