ContentObserver在安卓系统中无法正常工作

3

你好,我正在尝试使用下面的代码。此代码中的内容解析器无法正常工作。有人能给个建议吗?

getContentResolver().registerContentObserver(MyContentProvider.CONTENT_URI,true, new ContentObserver(new Handler()){

    @Override public void onChange(    boolean selfChange){

        showDialog();
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {

        // Handle change.
        showDialog();
    }
});

感谢您的提前帮助。

2
请解释一下“不起作用”的含义。另外,您在MyContentProvider中是否有适当的“通知”调用? - CommonsWare
这里没有调用onchange方法。很抱歉我不了解ContentProvider中的notify调用。我们真的需要它吗? - V I J E S H
2个回答

10

我可以使用ContentObserver作为FileObserver的替代吗?因为在Android 11及以上版本中,FileObserver无法正常工作。如果有任何小例子将不胜感激。我想监听所选目录或子目录中添加的任何文件。 - Smeet
好的,没问题,谢谢您的回复。我试过后会及时通知您。 - Smeet

9

问题

我遇到的问题是 ContentObserver.onChange() 方法从未被调用,因为 ContentObserverHandlerLooper 初始化不正确。在调用 Looper.prepare() 后忘记调用 Looper.loop()...这导致 Looper 没有消耗事件并调用 ContentObserver.onChange()

解决方案

解决方案是正确创建和初始化 ContentObserverHandlerLooper:

// creates and starts a new thread set up as a looper
HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();

// creates the handler using the passed looper
Handler handler = new Handler(thread.getLooper());

// creates the content observer which handles onChange on a worker thread
ContentObserver observer = new MyContentObserver(handler);

这是一个有用的stackoverflow帖子,关于如何控制ContentObserver.onChange()方法在哪个线程上执行。


1
谢谢,我也遇到了完全相同的问题! - Henrik Gyllensvärd

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