5

履歴のコンテンツ オブザーバーを実装しましたが、動作がおかしいです。履歴が変更されるたびに、その 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);
    }

}

オブザーバーも登録しました

BrowserOberser observer = new BrowserOberser();
getApplication().getContentResolver().registerContentObserver(Browser.BOOKMARKS_URI, true, observer );

マニフェストに必要な権限を追加しました。

コードは正常に動作しますが、onChange(); 履歴の変更ごとに 3 ~ 5 回実行し
ます。この問題の解決策を教えてくれる人はいますか?

4

3 に答える 3

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

しかし、誰かが onChange のどの反復 (問題の単純なコード内) がページ読み込みのどの状態に正確に対応するかを知ることができれば素晴らしいでしょう。私が学んだことから、最初の繰り返しのタイトルは url と同じで、3 回目の繰り返しでは正しいページ タイトルが存在していました。ただし、リダイレクト中に onChange が最大 5 回呼び出されました。では、どのイテレーションがどの段階に対応するかを誰かが確認できますか?

于 2013-05-27T05:07:15.993 に答える
1

答えが見つかるかもしれないと思います。最初に言いたいのは、私の英語力は限られているということです。理解していただけると幸いです。

実際、onChange();履歴の変更ごとに数回 (少なくとも 2 回) 実行されます。

ユーザーがブラウザを使用してウェブサイトを閲覧すると、システムがデータベースに履歴を追加してonChange();呼び出されるためです。しかし、現在、システムは URL のタイトルを認識していません。システムが URL のタイトルを取得した後、システムはデータベースを更新し、onChange();2 回目に呼び出されます。

また、その間に URL がリダイレクトされている場合、システムが新しい URL を取得するたびに、システムはデータベースも更新するため、onChange(); も呼ばれます。そのため、onChange は変更のたびに数回呼び出されると思います。あなたが私の英語を理解してくれることを願っています。

于 2015-05-06T09:15:54.787 に答える