Android历史内容观察者

Adi*_*tya 5 browser android android-contentprovider contentobserver

我实现了历史的内容观察者,但它表现得很奇怪.对于历史中的每个变化,它的onChange()函数运行3-5次.

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

}
Run Code Online (Sandbox Code Playgroud)

我也用我的观察员注册了

BrowserOberser observer = new BrowserOberser();
getApplication().getContentResolver().registerContentObserver(Browser.BOOKMARKS_URI, true, observer );
Run Code Online (Sandbox Code Playgroud)

并在清单中添加了所需的权限.

代码工作正常,但onChange(); 每次历史变化都会运行3-5次
任何人都可以帮我解决这个问题吗?

Adi*_*tya 2

这就是我最终至少解决了我的案例问题的方法(当历史发生变化时我想阅读历史)

    @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(); 
              } 
          }
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果有人能够告诉 onChange 的哪一次迭代(在问题的简单代码中)准确地对应于页面加载中的哪个状态,那就太好了。据我所知,在第一次迭代中标题与 url 相同,在第三次迭代中出现了正确的页面标题。但在重定向过程中,onChange 被调用了多达 5 次。那么有人可以确认哪个迭代对应于哪个阶段吗?