2013-05-24 3 views
6

वर्तमान में, मैं एक लोडरअंतर onContentChanged

@Override 
public Loader<List<HomeMenuRowInfo>> onCreateLoader(int arg0, Bundle bundle) { 
    return new HomeMenuRowInfosLoader(this.getSherlockActivity()); 
} 

कभी कभी, मैं सामग्री परिवर्तन की वजह से, फिर से फिर से लोड करने लोडर लिए कहना होगा। यह मैं करूँगा।

this.getLoaderManager().getLoader(0).onContentChanged(); 

हालांकि, मैं onCreateLoader कॉलबैक जब सामग्री में परिवर्तन के लिए कुछ अतिरिक्त बंडल जानकारी पारित करने के लिए करना चाहते हैं। मुझे onContentChanged का उपयोग करके एहसास है, ऐसा करने का कोई तरीका नहीं है।

एक ही रास्ता मैं पता लगा सकते हैं

this.getLoaderManager().restartLoader(0, bundle, this); 

मैं सोच रहा था है, वहाँ है Loader व्यवहार में कोई प्रमुख मतभेद onContentChanged के बजाय restartLoader का उपयोग कर, बंडल में पारित करने की क्षमता के अलावा की,?

उत्तर

4

मुझे लगता है, प्रमुख अंतर यह है कि restartLoader विधि वर्ष लोडर आईडी समान होता है कि नष्ट कर देता है और जब तक onContentChanged विधि एक नया एक शुरू होता है या तो लोडर बलों लोड करने के लिए (forceLoad) या बस एक झंडा कि इंगित करता है सेट है लोडर बंद होने पर सामग्री बदल गई है। दूसरे मामले में लोडर का 'मालिक' सामग्री बदल जाने के बाद लोड हो रहा है (पुनः) लोड करने के लिए ज़िम्मेदार है। मुझे लगता है कि यह loaderManager द्वारा restartLoader मामले में स्वचालित रूप से किया जाता है।

यदि आप restartLoader विधि का उपयोग करने का निर्णय लेते हैं तो आपको पुराने लोडर के विनाश और धीमे पुन: प्रारंभिकरण जैसे अन्य अनुप्रयोगों के संभावित प्रभावों को ध्यान में रखना चाहिए।

आप अधिक जानकारी के लिए तरीकों प्रलेखन पर एक नज़र ले जा सकते हैं - restartLoader और onContentChanged

भी ध्यान रखें कि वर्ष लोडर नष्ट हो जाता है जब नया एक अपना काम खत्म

0

कॉल restartLoader हर बार जब आप ताजा डेटा चाहते हैं या आप कर्सर के लिए अपने तर्क बदलना चाहते हैं।

आप initLoader का उपयोग करते हैं डेटा

lm = fragment.getLoaderManager(); 
lm.initLoader(LOADER_ID_LIST, null, this); 

लोड करने के लिए initLoader को प्रत्येक कॉल onLoadFinished के लिए एक ही कर्सर वापस आ जाएगी। onCreateLoader विधि केवल 1 कॉल पर initLoader पर कॉल की जाएगी। इसलिए आप क्वेरी को बदल नहीं सकते हैं। आपको उसी कर्सर को उसी डेटा को onLoadFinished विधि पर मिलता है।

@Override 
public void onLoadFinished(
     android.support.v4.content.Loader<Cursor> loader, Cursor cursor) { 
    switch (loader.getId()) { 
    case LOADER_ID_LIST: 
     // The asynchronous load is complete and the data 
     // load a list of 
     populateFromCursor(cursor); 
     break; 
    case LOADER_ID_ENTRY: 
     populateFromCursor(cursor); 
     break; 
    } 
    // The listview now displays the queried data. 
} 

तो onLoadFinished उपयोग restartLoader करने के लिए नए कर्सर डेटा प्राप्त करने के लिए और आप बंडल की जानकारी में पारित कर सकते हैं अगर आप चाहते हैं। नीचे मैं शून्य गुजर रहा हूं क्योंकि एक वैश्विक चर उपलब्ध है।

lm = fragment.getLoaderManager(); 
lm.restartLoader(LOADER_ID_LIST, null, this); 

loaderManager तो onCreateLoaderMethod कॉल करेंगे।

@Override 
public android.support.v4.content.Loader<Cursor> onCreateLoader(int id, 
     Bundle args) { 

    android.support.v4.content.Loader<Cursor> ret = null; 

    // Create a new CursorLoader with the following query parameters. 
    switch (id) { 

    // load the entire list 
    case LOADER_ID_LIST: 
     String sortOrder = null; 
     switch (mSortOrder) { 
     case 0: 
      sortOrder = RidesDatabaseHandler.KEY_DATE_UPDATE + " desc"; 
      break; 
     case 1: 
      sortOrder = RidesDatabaseHandler.KEY_ID + " desc"; 
      break; 
     case 2: 
      sortOrder = RidesDatabaseHandler.KEY_NAME; 
     } 
     return new CursorLoader(context, RidesDatabaseProvider.CONTENT_URI, 
       PROJECTION, null, null, sortOrder); 

     // load a single item 
    case LOADER_ID_ENTRY: 
     sortOrder = null; 
     String where = RidesDatabaseHandler.KEY_ID + "=?"; 

     String[] whereArgs = new String[] { Integer.toString(lastshownitem) }; 

     return new CursorLoader(context, RidesDatabaseProvider.CONTENT_URI, 
       PROJECTION, where, whereArgs, null); 
    } 
    return ret; 
} 

नोट: आप initLoader कॉल करने के लिए आप restartLoader हर बार है कि जब तक आप वास्तव में एक ही डेटा है कि पहले की क्वेरी से लौटाए गए चाहते हैं कॉल कर सकते हैं नहीं है। आपको onContentChanged() पर कॉल करने की आवश्यकता नहीं है और docs में यह कहता है कि Loader.ForceLoadContentObserver आपके लिए किया गया है।

1

राज्य आरेख को एपीआई का उपयोग करने के तरीके को समझने में मदद करनी चाहिए। पहली बार मैंने तस्वीर को स्पष्ट करने के लिए बहुत मिनट बिताए। मेरे काम का प्रयोग करें!

अनुच्छेद: https://plus.google.com/117981280628062796190/posts/8b9RmQvxudb

Loader States Diagram