微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何观察内容提供者的变化?安卓

我创建了一个Contentprovide,并实现了这样的update()方法
@Override
   public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs) {
      final sqliteDatabase db = mHelper.getWritableDatabase();
      int count = db.update(InslideDB.FOLDER_TABLE,values,selection,selectionArgs);

      /* To notify the observer */
      this.getContext().getContentResolver().notifyChange(URI,null);  
      return count;
}

如何在我的appwidget中获得通知?谢谢!

我正在尝试这个Resolver,但没有日志(——————–更改日期)打印:

class DataProviderObserver extends ContentObserver {
    private AppWidgetManager mAppWidgetManager;
    private ComponentName mComponentName;

    DataProviderObserver(AppWidgetManager mgr,ComponentName cn,Handler h) {
        super(h);
        mAppWidgetManager = mgr;
        mComponentName = cn;
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);  //NOTE: Have to call this. dwy.

        // The data has changed,so notify the widget that the collection view needs to be updated.
        // In response,the factory's onDataSetChanged() will be called which will requery the
        // cursor for the new data.

        Log.d("PresenterWidgetProvider","--------------------Date Changed");

        mAppWidgetManager.notifyAppWidgetViewDataChanged(
                mAppWidgetManager.getAppWidgetIds(mComponentName),R.id.inslide_grid);
    }
}


public class PresenterWidgetProvider extends appwidgetprovider{

    private static final String AUTHORITY = "com.apps.slide";

    static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/folder");

    public static final String EXTRA_INSLIDE_PATH = "EXTRA_WIDGET_PATH";
    private static HandlerThread sWorkerThread;
    private static Handler sWorkerQueue;
    private static DataProviderObserver sDataObserver;

    public PresenterWidgetProvider () {

        // Start the worker thread to update Content Provider.
        sWorkerThread = new HandlerThread("PresenterWidgetProvider worker");
        sWorkerThread.start();
        sWorkerQueue = new Handler(sWorkerThread.getLooper());

    }

    @Override
    public void onEnabled(Context context) {
        // Register for external updates to the data to trigger an update of the widget.  When using
        // content providers,the data is often updated via a background service,or in response to
        // user interaction in the main app.  To ensure that the widget always reflects the current
        // state of the data,we must listen for changes and update ourselves accordingly.
        final ContentResolver r = context.getContentResolver();
        if (sDataObserver == null) {
            final AppWidgetManager mgr = AppWidgetManager.getInstance(context);
            final ComponentName cn = new ComponentName(context,PresenterWidgetProvider.class);
            sDataObserver = new DataProviderObserver(mgr,cn,sWorkerQueue);
            r.registerContentObserver(CONTENT_URI,true,sDataObserver);
            Log.d("PresenterWidgetProvider","--------------------onEnabled. sDataObserver = " + sDataObserver);
        }
    }

所以,我终于通过4个步骤解决了:

>添加
this.getContext().getContentResolver().notifyChange(URI,null);

到ContentProvider的updat()insert()delete()回调.

>创建一个新的观察者和新的线程来处理它.
>在Observer的onChange()中调用notifyAppWidgetViewDataChanged().
>删除小部件并放置一个新的.

而已.

解决方法

您可以使用 ContentObserver类.您只需要实现该类,并使用getContentResolver().registerContentObserver()方法注册观察者.

原文地址:https://www.jb51.cc/android/311832.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐