2012-06-28 14 views
11

I'v एक Contentprovide बनाया है और यह अद्यतन() इस तरह विधि है लागू करता है:contentprovider परिवर्तन का निरीक्षण कैसे करें? एंड्रॉयड

@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 में सूचना मिल सकती है? धन्यवाद!

मैं इस रिज़ॉल्वर लेकिन कोई प्रवेश (-------------------- तिथि बदली) प्रिंट कोशिश कर रहा हूँ:

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 कदम से इसे हल:

  1. ContentProvider के updat() को सम्मिलित करने के this.getContext().getContentResolver().notifyChange(URI, null);

जोड़ें() को हटा दें() कॉलबैक।

  1. इसे संभालने के लिए एक नया पर्यवेक्षक और नया थ्रेड बनाएं।

  2. ऑब्जर्वर के ऑन चेंज() में NOTifyifyWidgetViewDataChanged() को कॉल करें।

  3. विजेट हटाएं और एक नया स्थान दें।

यही है।

+1

इसे साझा करने के लिए धन्यवाद। मुझे लगता है कि पर्यवेक्षक को ऑनएबल में पंजीकृत करने के लिए पर्याप्त नहीं है, क्योंकि डिवाइस को पुनरारंभ करने के बाद सक्षम नहीं किया जाता है। मैं इसे वापस कर दूंगा। – mtotschnig

उत्तर

15

आप ContentObserver कक्षा का उपयोग कर सकते हैं। आपको बस उस वर्ग को लागू करना होगा और पर्यवेक्षक को पंजीकृत करने के लिए getContentResolver().registerContentObserver() विधि का उपयोग करना होगा।

+0

@ क्रिस्टियन धन्यवाद! और मैंने ContentObserver का उपयोग किया है लेकिन यह कॉलबैक ऑन चेंज() को कॉल नहीं करता है। मैंने प्रश्नों को कोड अपडेट कर दिया है। मुझे पर्यवेक्षक का उपयोग करने के तरीके और विजेट को अपडेट करने के तरीके के बारे में थोड़ा सा जानकारी मिल रही है। एक बार फिर धन्यवाद! – herbertD

+2

मुझे लगता है कि आप अपने 'AppWidgetProvider' के अंदर पर्यवेक्षक को पंजीकृत नहीं कर सकते हैं। इसके बजाय, अपने 'AppWidgetProvider' से एक सेवा शुरू करें, और वहां से अपना' ContentObserver' पंजीकृत करें। – Cristian

+0

मैंने इसे हल किया है। पूरा कोड ऊपर अद्यतन किया गया है। धन्यवाद। – herbertD

संबंधित मुद्दे