2013-04-22 4 views
8

के बिना लोडर कॉलबैक का उपयोग करना मैं AsyncTaskLoader पर कुछ हाथ पढ़ रहा हूं ताकि मैं संपर्क सूची लोड करने के लिए तकनीक का उपयोग कर सकूं। कोड काम करने का एकमात्र समय यह है कि जब मैं को MyLoader extends Fragment implements LoaderCallbacks<ArrayList<Contact>> में विस्तारित करता हूं तो उस वर्ग से कॉलबैक लागू करता है। क्या कोई और तरीका है? मेरे बैकएंड को भेजने के लिए मुझे वास्तव में संपर्क सूची (नाम, फोन, थंबनेल) की ज़रूरत है। उदाहरण के लिए, मैं Context का उपयोग करने का प्रयास करता हूं, क्योंकि मैं इसे (Context)this करके किसी भी गतिविधि से प्राप्त कर सकता हूं, कोड संकलित करने में भी विफल रहता है। संदर्भ से मेरा मतलब हैFragment

context.getLoaderManager().initLoader(1, null, this); 
//I already changed to Fragment so don't really remember the exact ".context" line. 
//But someone who has done this will understand the snippet. 

बीटीडब्ल्यू: मैं कई संदर्भों का उपयोग कर रहा हूं। एक http://developer.android.com/reference/android/content/AsyncTaskLoader.html है।

प्रश्न (दोबारा): क्या मैं बिना किसी फ्रेगमेंट या फ्रैगमेंट एक्टिविटी के AsyncTaskLoader का उपयोग कर सकता हूं?

कोड है जो विभाजन के साथ काम करता है:

package com.example.contactpreload.utils; 

import java.util.ArrayList; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.LoaderManager.LoaderCallbacks; 
import android.support.v4.content.Loader; 

public class LoadingContacts extends Fragment implements LoaderCallbacks<ArrayList<Contact>> { 
    ArrayList<Contact> loadedContacts; 
    static Fragment fragmentActivity; 

    public static LoadingContacts newInstance(int arg) { 

     LoadingContacts f = new LoadingContacts(); 
     Bundle bundle = new Bundle(); 
     bundle.putInt("index", arg); 
     f.setArguments(bundle); 
     fragmentActivity = new Fragment(); 
     return f; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     System.out.println("onCreate()"); 
     int mIndex = getArguments().getInt("index"); 
     System.out.println(mIndex); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     System.out.println("onActivityCreated()"); 
     getLoaderManager().initLoader(1, null, this); 
    } 

    @Override 
    public Loader<ArrayList<Contact>> onCreateLoader(int arg0, Bundle arg1) { 

     System.out.println("onCreateLoader()"); 
     return new ContactsLoader(getActivity()); 
    } 

    @Override 
    public void onLoadFinished(Loader<ArrayList<Contact>> loader, ArrayList<Contact> data) { 
     loadedContacts = data; 
     System.out.println("AND THE CONTACTS ARE: "); 
     for (Contact c : loadedContacts) { 
      System.out.println("NAME: " + c.getName()); 
      System.out.println("getPhoneNumberHome: " + c.getPhoneNumber()); 
     } 

    } 

    @Override 
    public void onLoaderReset(Loader<ArrayList<Contact>> arg0) { 
     System.out.println("onLoaderReset()"); 
     // TODO Auto-generated method stub 

    } 

} 



package com.example.contactpreload; 

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.Menu; 

import com.example.contactpreload.utils.LoadingContacts; 

public class MainActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     LoadingContacts fragment = LoadingContacts.newInstance(1); 
     fragment.setRetainInstance(true); 
     getSupportFragmentManager().beginTransaction() 
      .add(android.R.id.content, fragment).commit(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

MANIFEST:

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="16" /> 
+0

@ बॉसिलोबस्टर, मैं इसका जवाब देने की कोशिश कर रहा हूं, लेकिन मैं इसे क्रैक नहीं कर रहा हूं। कोई इनपुट? आपके सहयोगियों के बारे में कैसे? मुझे स्तर 8 एपीआई भाग क्या मिलता है। यह वास्तव में टुकड़े के साथ काम करता है लेकिन स्पष्ट रूप से कुछ और नहीं (wangyif2 की प्रतिक्रिया में नीचे चर्चा को रेफरी करें)। –

उत्तर

7

AsyncTaskLoader आप एक Fragment या एक Activity उपयोग कर रहे हैं कि क्या कोई लेना देना नहीं है।

आपको एक उदाहरण एक सूची गतिविधि देते हैं, पर विचार करने के लिए:

public class ExampleActivity extends ListActivity implements 
LoaderManager.LoaderCallbacks<Cursor> { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.todo_list); 

     //to start the loader: 
     getLoaderManager().initLoader(0, null, this); 
    } 

    //override the loader callback methods as usual 
    // Creates a new loader after the initLoader() call 
    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     CursorLoader cursorLoader = new CursorLoader(this, 
     uri, projection, null, null, null); 
     return cursorLoader; 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     adapter.swapCursor(data); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     // data is not available anymore, delete reference 
     adapter.swapCursor(null); 
    } 
} 

जाहिर है आप सूची दृश्य और लेआउट के लिए इसी एडाप्टर बनाने की जरूरत है, लेकिन कैसे कर्सर के लिए एक सरल लोडर काम करेगा उदाहरण केवल आपके चलता एक गतिविधि के लिए।

इसके अलावा, या तो support.v4 पुस्तकालय, या नियमित रूप से पुस्तकालय का उपयोग कर, सुनिश्चित करें कि आपके सभी आयात संगत हों:

import android.app.LoaderManager; 
import android.content.CursorLoader; 
import android.content.Loader; 

एक और सवाल है कि कहा जाता है, यह है कि अगर LoaderCallback इंटरफ़ेस स्टैंडअलोन इस्तेमाल किया जा सकता। यदि आप मानते हैं कि LoaderCallback है तो यह अनुशंसित नहीं है।

The LoaderManager.LoaderCallbacks<D> interface is a simple contract that the LoaderManager uses to report data back to the client. इसका क्या मतलब है, इसका एकमात्र काम क्लाइंट द्वारा अनुरोधित पृष्ठभूमि में कुछ डेटा लोड करना है, जो प्रभावी रूप से एक गतिविधि है।

यदि आप एक स्टैंडअलोन क्लास बनाते हैं, तो आप LoaderManager.LoaderCallbacks<D> को लागू करने के लिए कक्षा परिभाषा का विस्तार कर सकते हैं, लेकिन आपको किसी भी प्रकार की तंत्र के माध्यम से लोड किए गए डेटा को मूल गतिविधि में वापस रिपोर्ट करने की आवश्यकता होगी, जो एक साधारण कार्य को जटिल करेगा।

अब अगर आप वास्तव में ऐसा करने पर तय कर रहे हैं, तो आप अपने स्टैंडअलोन वर्ग इतनी के रूप में बना सकते हैं:

public class LoadingContacts implements LoaderManager.LoaderCallbacks<Cursor> { 
@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    return null; 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
} 
} 

अपने onLoadFinished विधि में, आप लोड Cursor या तो एक प्रसारण के माध्यम से वापस भेजने की आवश्यकता होगी, या संदेश बस किसी तरह का:

  • LocalBroadcastManager
  • Otto
  • Messenger

के बाद आप MainActivity को यह जानकारी भेजने के लिए, आप इसे एडाप्टर के लिए लोड और है के रूप में जारी रख सकते हैं।

+1

आपके उत्तर के लिए बहुत धन्यवाद: +1। मैंने अब कोड जोड़ा है जो फ्रैगमेंट और फ्रैगमेंट एक्टिविटी के साथ काम करता है। क्या आप इसे अपने उत्तर में संपादित करने के बारे में सोचते हैं कि यह कैसे काम करेगा यदि 'लोडिंग संपर्क' की कोई मूल गतिविधि नहीं थी (उदा। फ्रैगमेंट) और 'मेनएक्टिविटी' ने फ्रैगमेंट एक्टिविटी को बढ़ाया नहीं था? – learner

+2

मुझे आपको प्रश्न समझने दो, आप 'मुख्य गतिविधि' को 'गतिविधि' और 'लोडिंग संपर्क' को विस्तारित करना चाहते हैं, पूरी तरह से लोडर होने के लिए, 'गतिविधि' या 'टुकड़ा' नहीं? – wangyif2

+3

मैं यह देखने के लिए curios हूँ कि यह भी कैसे काम करेगा। –

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