我实现了历史的内容观察者,但是它在历史上的每一个变化都是运行weird.For的,它的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次
有人能帮我解决这个问题吗?
发布于 2013-05-27 05:07:15
这就是我最终解决问题的方法--至少是这样(我想在历史发生变化的时候阅读历史)。
@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次电话。那么,有人能确认哪一个迭代序列响应到哪个阶段吗?
发布于 2015-05-06 09:15:54
我想我会找到答案的。首先,我想说我的英语是有限的,我希望你能理解我。
事实上,对于历史上的每一个变化,onChange();运行了几次,至少两次。
因为当用户使用浏览器浏览网站时,系统会在数据库中添加历史记录,然后调用onChange();。但现在系统还不知道网址的名称。当系统获得网址的标题后,系统对数据库进行更新,并调用onChange();。
而且,如果url在此期间重定向,则每次系统获得新的url时,系统也会更新数据库,因此onChange();也会被调用。因此,我认为每次更改都会调用onChange几次。希望你能听懂我的英语。
https://stackoverflow.com/questions/16643744
复制相似问题