如何在偏好设置中取消注册内容观察器

4

我正在开发一个应用程序,其中有一个任务是处理偏好设置,因此我实现了开关偏好设置。如果开关打开,我需要监视联系人数据库,所以我使用内容观察器。当用户关闭开关时,我需要取消注册该内容观察器。请看我实现的代码:

MyContentObserver observer;
switchPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference,
                Object newValue) {
            boolean switched = ((SwitchPreference) preference)
                    .isChecked();

           if( !switched){
            //   Toast.makeText(SettingActivity.this,"Switch is on",Toast.LENGTH_SHORT).show();
           observer=new MyCOntentObserver();
               getContentResolver()
               .registerContentObserver(
                       ContactsContract.Contacts.CONTENT_URI, true,
                       observer); 

           }
               else{
            //   Toast.makeText(SettingActivity.this,"Switch is off",Toast.LENGTH_SHORT).show();

               //   getContentResolver().unregisterContentObserver(observer);
               //here i want a logic that to destroy instance which i created
                 while switch is On


}
               return true;
        }
    });
  public class MyContentObserver extends ContentObserver{
            public MyCOntentObserver() {
                super(null);
            }
            @Override
            public void onChange(boolean selfChange) {
            super.onChange(selfChange);
                Log.e("","~~~~~~contact inserted or updated"+selfChange);
            }  

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

任何建议或帮助都将不胜感激。
1个回答

2

可以了。您只需使用相同的观察者调用 unregisterContentObserver 来删除通知。但是为了避免错误,如果观察者已经被删除,请将其添加到 try-catch 块中。

try {  
getContentResolver().unregisterContentObserver(observer);  
} catch (IllegalStateException ise) {  
// Do Nothing.  Observer has already been unregistered.  
}  

您不需要销毁实例,只需确保它是单例。因此,如果用户重新打开设置,则会回收该实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接