【问题标题】:Onchange function of the content observer class being called more than once内容观察者类的 Onchange 函数被多次调用
【发布时间】:2011-06-13 05:16:57
【问题描述】:

我正在使用contentObserver 来监视sms content provider 的内容,我已经放置了一个Log.d() 标记用于调试,并且logcat 中的标记被多次看到,这意味着onchange() id被多次调用,我该如何防止这种情况发生。我已经在后台运行的服务中实现了观察者。 这是代码

package com.messageHider;

 import android.app.Service;
 import android.content.ContentResolver;
 import android.content.Intent;
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.IBinder;
 import android.util.Log;
 import android.widget.Toast;

 public class smsSentService extends Service {
ContentResolver contentResolver;
Uri uri=Uri.parse("content://sms/");
Handler handler;
@Override
public IBinder onBind(Intent arg0) {
    return null;
}
@Override
public void onCreate() {
    contentResolver=getContentResolver();
    contentResolver.registerContentObserver(uri, true, new contentObserver(handler));
    Log.d("SENTSERVICE", "Service created");
    super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
    Log.d("SENTSERVICE", "Service started");
    super.onStart(intent, startId);
}
@Override
public void onDestroy() {
    super.onDestroy();
}
public class contentObserver extends ContentObserver
{
    public contentObserver(Handler handler) {
        super(handler);

    }
    @Override
    public void onChange(boolean selfChange) {
        Cursor cursor=contentResolver.query(uri, null, null, null, null);
        cursor.moveToFirst();
        String type=cursor.getString(cursor.getColumnIndex("type"));
        Log.d("THEMESSAGE", type);
        super.onChange(selfChange);
    }
}

}


【问题讨论】:

    标签: android


    【解决方案1】:

    只是一个建议:在 onResume 方法上注册内容观察者并在 onPause 上取消注册。

    【讨论】:

      【解决方案2】:

      我正在使用内容观察器查看出站 SMS 消息,并注意到如果您尝试从模拟器发送出站 SMS,您实际上会看到 3 个实例通过,因为它试图重新发送文本但失败了.您是否也会在入站短信中看到这种情况?

      如果仅用于出站 SMS 消息,请查看 SMS 状态字段。 -1 值表示失败。

      【讨论】:

        【解决方案3】:

        您需要重写 DeliverSelfNotifications() 以返回 true。

        class contentObserver extends ContentObserver { private Context mContext;
        
            public contentObserver(Handler handler) {
                super(handler);
        
            }
        
            @Override
            public void onChange(boolean selfChange) {
                Cursor cursor=contentResolver.query(uri, null, null, null, null);
                cursor.moveToFirst();
                String type=cursor.getString(cursor.getColumnIndex("type"));
                Log.d("THEMESSAGE", type);
                super.onChange(selfChange);
            }
        
            @Override
            public boolean deliverSelfNotifications() {
                return true;
            }
        }
        

        【讨论】:

        • 我覆盖了 deliverSelfNotifications() 然后 onChange() 也被调用了两次。
        【解决方案4】:

        为了观察你想要的任何内容,你必须按照你的方式注册观察者。然而,onChange 回调被不同的标志调用,例如 ContentResolver.NOTIFY_INSERT 或 ContentResolver.NOTIFY_UPDATE 等,这意味着一些内容刚刚被插入或更新。因此,在您的 contentObserver 中,您可能需要检查导致回调被调用的事件

        private val contentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {
                override fun onChange(selfChange: Boolean, uri: Uri?, flags: Int) {
                    super.onChange(selfChange, uri, flags)
        
                    uri?.let {
                        if (flags == ContentResolver.NOTIFY_INSERT)
                            // do something
                    }
                }
            }
        
        
        
        ....
        contentResolver.registerContentObserver(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, contentObserver
                )
        

        上面的示例观察从应用程序插入的新图像的内容。我不知道这对你的例子有什么帮助,但我遇到了和你一样的问题,直到我检查了标志

        希望这有帮助..!

        【讨论】:

          猜你喜欢
          • 2011-08-26
          • 2012-05-23
          • 1970-01-01
          • 2015-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多