Android onChange()方法只返回false
我在活动中将ContentObserver onChange()声明为子类。但它总是返回false。谁能告诉我为什么 (更新) 如果CallLog内容提供程序发生更改,则此代码必须调用fillList。我的意思是,如果我进行一个新的调用,那么调用的数据将插入到内容提供程序中,因此它必须返回给观察者那里发生了变化,因此它将调用fillList()。但是它总是返回false,即使我在emulator上进行了一个新的调用 这是代码Android onChange()方法只返回false,android,android-contentprovider,android-context,calllog,android-sdk-2.3,Android,Android Contentprovider,Android Context,Calllog,Android Sdk 2.3,我在活动中将ContentObserver onChange()声明为子类。但它总是返回false。谁能告诉我为什么 (更新) 如果CallLog内容提供程序发生更改,则此代码必须调用fillList。我的意思是,如果我进行一个新的调用,那么调用的数据将插入到内容提供程序中,因此它必须返回给观察者那里发生了变化,因此它将调用fillList()。但是它总是返回false,即使我在emulator上进行了一个新的调用 这是代码 public class RatedCalls extends
public class RatedCalls extends ListActivity {
private static final String LOG_TAG = "RatedCallsObserver";
private Handler handler = new Handler();
private RatedCallsContentObserver callsObserver = null;
private SQLiteDatabase db;
private CallDataHelper dh = null;
StringBuilder sb = new StringBuilder();
OpenHelper openHelper = new OpenHelper(RatedCalls.this);
class RatedCallsContentObserver extends ContentObserver {
public RatedCallsContentObserver(Handler h) {
super(h);
}
public void onChange(boolean selfChange) {
Log.d(LOG_TAG, "RatedCallsContentObserver.onChange( " + selfChange
+ ")");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
registerContentObservers();
fillList();
}
@Override
public void onStart() {
super.onStart();
registerContentObservers();
}
@Override
public void onStop() {
super.onStop();
unregisterContentObservers();
}
private void fillList() {
Cursor cursor = getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
android.provider.CallLog.Calls.DATE + " DESC ");
cursor.setNotificationUri(getBaseContext().getContentResolver(),
android.provider.CallLog.Calls.CONTENT_URI);
dh = new CallDataHelper(this);
db = openHelper.getWritableDatabase();
startManagingCursor(cursor);
int numberColumnId = cursor
.getColumnIndex(android.provider.CallLog.Calls.NUMBER);
int durationId = cursor
.getColumnIndex(android.provider.CallLog.Calls.DURATION);
int contactNameId = cursor
.getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
int dateId = cursor.getColumnIndex(android.provider.CallLog.Calls.DATE);
int numTypeId = cursor
.getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE);
// int contactIdColumnId =
// cursor.getColumnIndex(android.provider.ContactsContract.RawContacts.CONTACT_ID);
Date dt = new Date();
int hours = dt.getHours();
int minutes = dt.getMinutes();
int seconds = dt.getSeconds();
String currTime = hours + ":" + minutes + ":" + seconds;
ArrayList<String> callList = new ArrayList<String>();
if (cursor.moveToFirst()) {
do {
String contactNumber = cursor.getString(numberColumnId);
String contactName = cursor.getString(contactNameId);
String duration = cursor.getString(durationId);
String callDate = DateFormat.getDateInstance().format(dateId);
String numType = cursor.getString(numTypeId);
ContentValues values = new ContentValues();
values.put("contact_id", 1);
values.put("contact_name", contactName);
values.put("number_type", numType);
values.put("contact_number", contactNumber);
values.put("duration", duration);
values.put("date", callDate);
values.put("current_time", currTime);
values.put("cont", 1);
getBaseContext().getContentResolver().notifyChange(
android.provider.CallLog.Calls.CONTENT_URI, null);
callList.add("Contact Number: " + contactNumber
+ "\nContact Name: " + contactName + "\nDuration: "
+ duration + "\nDate: " + callDate);
this.db.insert(CallDataHelper.TABLE_NAME, null, values);
Toast.makeText(getBaseContext(), "Inserted!", Toast.LENGTH_LONG);
} while (cursor.moveToNext());
setListAdapter(new ArrayAdapter<String>(this, R.layout.listitem,
callList));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(),
((TextView) view).getText(), Toast.LENGTH_SHORT)
.show();
}
});
}
}
private void registerContentObservers() {
ContentResolver cr = getContentResolver();
callsObserver = new RatedCallsContentObserver(handler);
cr.registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI,
true, callsObserver);
}
private void unregisterContentObservers() {
ContentResolver cr = getContentResolver();
if (callsObserver != null) { // just paranoia
cr.unregisterContentObserver(callsObserver);
callsObserver = null;
}
}
}
公共类RatedCalls扩展了ListActivity{
私有静态最终字符串日志\u TAG=“RatedCallsObserver”;
私有处理程序=新处理程序();
private RatedCallsContentTobServer调用SobServer=null;
专用数据库数据库;
private CallDataHelper dh=null;
StringBuilder sb=新的StringBuilder();
OpenHelper OpenHelper=新的OpenHelper(RatedCalls.this);
类RatedCallsContentObserver扩展ContentObserver{
公用费率呼叫内容服务器(处理程序h){
超级(h);
}
公共void onChange(布尔自更改){
Log.d(Log_标记,“RatedCallsContentTobServer.onChange”(“+selfChange
+ ")");
}
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
RegisterContentObserver();
填充列表();
}
@凌驾
public void onStart(){
super.onStart();
RegisterContentObserver();
}
@凌驾
公共void onStop(){
super.onStop();
未注册的内容观察员();
}
私有无效填充列表(){
Cursor Cursor=getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI,null,null,null,
android.provider.CallLog.Calls.DATE+“DESC”);
cursor.setNotificationUri(getBaseContext().getContentResolver(),
android.provider.CallLog.Calls.CONTENT(URI);
dh=新的CallDataHelper(此);
db=openHelper.getWritableDatabase();
开始管理游标(游标);
int numberColumnId=光标
.getColumnIndex(android.provider.CallLog.Calls.NUMBER);
int durationId=游标
.getColumnIndex(android.provider.CallLog.Calls.DURATION);
int contactNameId=游标
.getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
int dateId=cursor.getColumnIndex(android.provider.CallLog.Calls.DATE);
int numTypeId=游标
.getColumnIndex(android.provider.CallLog.Calls.CACHED\u NUMBER\u类型);
//int contactIdColumnId=
//cursor.getColumnIndex(android.provider.ContactsContract.RawContacts.CONTACT\u ID);
日期dt=新日期();
int hours=dt.getHours();
int minutes=dt.getMinutes();
int seconds=dt.getSeconds();
字符串currTime=hours+“:”+minutes+“:”+seconds;
ArrayList callList=新的ArrayList();
if(cursor.moveToFirst()){
做{
String contactNumber=cursor.getString(numberColumnId);
String contactName=cursor.getString(contactNameId);
String duration=cursor.getString(durationId);
字符串callDate=DateFormat.getDateInstance().format(日期ID);
String numType=cursor.getString(numTypeId);
ContentValues=新的ContentValues();
值。put(“联系人id”,1);
值。输入(“联系人姓名”,联系人姓名);
value.put(“数字类型”,numType);
值。输入(“联系人号码”,联系人号码);
值。put(“持续时间”,持续时间);
值。put(“日期”,callDate);
值。put(“当前时间”,currTime);
价值。put(“cont”,1);
getBaseContext().getContentResolver().notifyChange(
android.provider.CallLog.Calls.CONTENT_URI,null);
添加(“联系人号码:”+联系人号码
+\n联系人名称:“+contactName+”\n联系人:
+持续时间+“\n日期:”+callDate);
this.db.insert(CallDataHelper.TABLE_NAME,null,value);
Toast.makeText(getBaseContext(),“Inserted!”,Toast.LENGTH\u LONG);
}while(cursor.moveToNext());
setListAdapter(新阵列适配器)(此,R.layout.listitem,
呼叫列表);
ListView lv=getListView();
lv.setTextFilterEnabled(真);
setOnItemClickListener(新的android.widget.AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
Toast.makeText(getApplicationContext(),
((TextView)view.getText(),Toast.LENGTH\u SHORT)
.show();
}
});
}
}
私有void RegisterContentObserver(){
ContentResolver cr=getContentResolver();
callsObserver=newratedcallscontentobserver(处理程序);
cr.registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI,
true,callsObserver);
}
私有void unregisterContentObservators(){
ContentResolver cr=getContentResolver();
如果(callsObserver!=null){//只是妄想症
cr.unregisterecontentobserver(callsObserver);
callsObserver=null;
}
}
}
函数不返回false,因为它不返回任何内容。其返回类型为void
。它接收false作为参数
为什么?
我在Google中输入了“android onchange”并选择了第一个结果,结果如下:
This method is called when a change occurs to the cursor that is being observed.
Parameters
selfChange true if the update was caused by a call to commit on the cursor
that is being observed.
因此,所发生的一切就是通过调用其.commit()
方法更改了光标,而不是。如果调用了.commit()
,您将只记录此函数的“true”输入。我的观点是“这就是如何应用一些基本的问题解决技能,至少更好地了解正在发生的事情”。但无论如何。。。即使在某个地方调用.commit()
,也只会导致