2012-02-13 18 views
8

मैंने एसडीके में SimpleSyncAdapter नमूना प्रोजेक्ट की लाइनों के साथ एक सिंक एडाप्टर, खाता प्रबंधक और निजी सामग्री प्रदाता लागू किया है। यह सब ठीक काम कर रहा है।एंड्रॉइड सिंक एडाप्टर कॉलबैक

अब मैं उपयोगकर्ता को एक संदेश दिखाना चाहता हूं जब एक दूरस्थ ध्वज सेट वाले रिमोट सर्वर से नई पंक्तियां डाउनलोड की गई हों। जब सिंक समाप्त हो जाता है तो मुझे सिंक एडाप्टर से कॉलबैक की आवश्यकता होती है, इसलिए मैं क्वेरी कर सकता हूं और एक गतिविधि से संदेश प्रदर्शित कर सकता हूं। मैंने स्टैक ओवरव्लो पर कुछ प्रश्नों को देखा है, लेकिन इस पर चर्चा करने के लिए कोई भी अच्छा जवाब नहीं है।

How does one listen for progress from Android SyncAdapter? कहता है कि सिंकस्टैटस ऑब्सर्वर बेकार है। उपयोगकर्ता mobibob सिंक थ्रेड से यूआई को वापस जवाब देने के लिए एक परिणाम रिसीवर का उपयोग करने का सुझाव देता है।

How to know when sync is finished? आपके SyncService में एक इरादा का उपयोग करने का सुझाव देता है।

How to signal sync-complete to the Android SyncManager? SyncResult का उपयोग करने का सुझाव देता है। Maxpower47 द्वारा लिंक किया गया उदाहरण कोड अपवादों की रिपोर्ट करने के लिए SyncResult क्लास का उपयोग करता है लेकिन सिंक सफलतापूर्वक पूरा होने पर वास्तव में रिपोर्ट नहीं करना है।

मुझे नहीं पता कि सबसे अच्छा विकल्प कौन सा है और मैंने कोई उदाहरण परियोजना नहीं देखी है जहां इनमें से कोई भी समाधान उपयोग किया जाता है।

+0

बिल्कुल उसी स्थिति में - क्या आपने इसे काम करने का प्रबंधन किया? – HGPB

उत्तर

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं खुद ही यही बात पूछ रहा था। जब डेटा पहचान

registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer) 

यह एक पर्यवेक्षक वर्ग कि कॉलबैक मिलता रजिस्टर: क्या मैं एक अच्छा समाधान के रूप में पता चला, विशेष रूप से, क्योंकि मैं आप कर रहे हैं के रूप में स्थानीय डेटा के साथ काम कर रहा हूँ, ContentResolver से निम्न विधि का उपयोग करने के लिए है किसी दिए गए सामग्री द्वारा यूआरआई परिवर्तन। लेकिन यह तब हो सकता है जब आपका ContentProvider अधिसूचना भेजता हो। उदाहरण के लिए, आप ContentObserver पर सूचना पाने के लिए ऊपर एक ContentProvider के माध्यम से अपने डेटाबेस पर किया सभी अद्यतन के लिए, अपने ContentProvider इस के समान अद्यतन को लागू करना चाहिए चाहते हैं:

@Override 
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) { 
    // code goes here 
    this.getContext().getContentResolver().notifyChange(uri, null); 
    return 0; 
} 

notifyForDescendents का उपयोग करते हुए करते एक registerContentObserver हो सकता है बहुत उपयोगी।

1

यह एक पुराना सवाल है, लेकिन मैंने पिछले कुछ दिनों में कुछ शोध किया है और सिंक एडाप्टर नेटवर्क अनुरोधों को संभालने और यूआई को सूचित करने पर कई उदाहरण नहीं हैं।

सबसे पहले आपको अपने जीवन को आसान बनाने के लिए सामग्री प्रदाता के साथ लोडर का उपयोग करना चाहिए। लोडर यह आपके लिए करता है अब आपको सामग्री रिज़ॉल्वर के लिए पंजीकरण करने की आवश्यकता नहीं है। तो इसका मतलब है कि आपके यूआई को आपके कंटेंट प्रदाता में जो कुछ भी जाता है उसके लिए अधिसूचित किया जाता है।

क्या हुआ अगर कुछ भी नहीं बदला? सबकुछ अद्यतित था या आपके पास नेटवर्क त्रुटि थी।

  1. आप, गूगल आई/ओ ऐप्लिकेशन के रूप में अपने SyncAdapter की स्थिति को सुन सकते हैं BaseActivity
  2. मैं डिफ़ॉल्ट एंड्रॉयड ईमेल अनुप्रयोग पर एक नज़र था में mSyncStatusObserver के लिए खोज और वे एक Singleton के साथ प्रयोग कॉलबैक।
  3. आप किसी भी व्यवहार के यूआई को सूचित करने के लिए ब्रॉडकास्ट इंटेंट्स या इवेंटबस (उदाहरण के लिए स्क्वायर ओटो) का उपयोग कर सकते हैं।

मुझे अंतिम एक बेहतर पसंद है क्योंकि यह आपको सिंक एडाप्टर में होने वाली घटनाओं पर अधिक ग्रैन्युलरिटी देता है।

+0

क्या आपके पास ओटो का उपयोग सिंकएडाप्टर के साथ करने का कोई उदाहरण है? – toobsco42

+0

क्षमा करें मेरे पास वर्तमान में कोई नहीं है, मेरे पास एक [नमूना प्रोजेक्ट] है (https://github.com/sebastienrouif/notesSyncAdapter) जहां त्रुटियों को पकड़ने के अलावा SyncHelper.java में आप ईवेंट त्रुटियां भेज सकते हैं। यूआई पक्ष पर यह एक नियमित घटना हैंडलिंग है। – Sebastien

+0

शानदार सेबेस्टियन !! +1 –

-2

हम इसी तरह की स्थिति में भाग गए और सिंक एडाप्टर को एक स्थिर श्रोता इंटरफ़ेस लिखा। श्रोता गतिविधि है और डेटा उपलब्ध होने पर आवश्यक क्रियाएं करता है (अद्यतन यूआई)। यह तब भी काम करता है जब सिस्टम द्वारा सिंक-एडाप्टर को ऑटोसिंक के दौरान बुलाया जाता है जहां यह श्रोता शून्य होगा और सिंक प्रक्रिया अपने व्यवसाय को दिमाग में रखेगी।

class SyncAdapter extends AbstractThreadedSyncAdapter { 

    protected static Listener uiListener = null; 
    public interface Listener { 
     public void onSync(); 
    } 
    public static void setListener(Listener l) { 
     uiListener = l; 
    } 
    public static void clearListener() { 
     uiListener = null; 
    } 
    protected void broadcastSync() { 
     if (uiListener != null) 
      uiListener.onSync(); 
    } 
    public void onPerformSync(Account account, Bundle extras, String authority, 
          ContentProviderClient provider, SyncResult syncResult) { 

     // call broadcastSync(); 
    } 

फिर गतिविधि में, SyncAdapter.Listener इंटरफ़ेस लागू करें।

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