2011-11-19 12 views
6

मैंने इसके लिए हर जगह खोज की लेकिन कोई भी जवाब नहीं दे रहा है।गतिविधि को प्रीलोड कैसे करें?

मेरे सरल सवाल यह है:

वहाँ एक गतिविधि को पहले से लोड करने के लिए एक तरीका है? मुझे इसकी आवश्यकता है क्योंकि मैं एक टैब का उपयोग करता हूं, और एक टैब में कई गतिविधियां होती हैं। मेरी गतिविधियों में से एक एक आरएसएस पाठक है, और यह बहुत कठिन (लगभग 2-3 सेकंड) लोड करता है।

वेब पर जो कुछ भी मिला वह एक मजाक है। हर किसी की राय है, लेकिन कोई भी आपको नमूना कोड पर इंगित नहीं कर सकता है। उत्तर की प्रतीक्षा कर रहा है, धन्यवाद!

At onCreate: 
// go get our feed! 
     feed = getFeed(RSSFEEDOFCHOICE); 

     // display UI 
     UpdateDisplay(); 

     countdown(); 


And the functions: 

private RSSFeed getFeed(String urlToRssFeed) 
    { 
     try 
     { 
      // setup the url 
      URL url = new URL(urlToRssFeed); 

      // create the factory 
      SAXParserFactory factory = SAXParserFactory.newInstance(); 
      // create a parser 
      SAXParser parser = factory.newSAXParser(); 

      // create the reader (scanner) 
      XMLReader xmlreader = parser.getXMLReader(); 
      // instantiate our handler 
      RSSHandler theRssHandler = new RSSHandler(); 
      // assign our handler 
      xmlreader.setContentHandler(theRssHandler); 
      // get our data via the url class 
      InputSource is = new InputSource(url.openStream()); 
      // perform the synchronous parse   
      xmlreader.parse(is); 
      // get the results - should be a fully populated RSSFeed instance, or null on error 

      return theRssHandler.getFeed(); 
     } 
     catch (Exception ee) 
     { 
      // if we have a problem, simply return null 
      return null; 
     } 
    } 


private void UpdateDisplay() 
    { 
     TextView feedtitle = (TextView) findViewById(R.id.feedtitle); 
     TextView feedpubdate = (TextView) findViewById(R.id.feedpubdate); 
     ListView itemlist = (ListView) findViewById(R.id.itemlist); 


     if (feed == null) 
     { 
      feedtitle.setText("No RSS Feed Available"); 
     return; 
     } 

     feedtitle.setText(feed.getTitle()); 
     feedpubdate.setText(feed.getPubDate()); 

     ArrayAdapter<RSSItem> adapter = new ArrayAdapter<RSSItem>(this,android.R.layout.simple_list_item_1,feed.getAllItems()); 

     itemlist.setAdapter(adapter); 

     itemlist.setOnItemClickListener(this); 

     itemlist.setSelection(0); 

     } 
+0

बेहतर AsyncTask का उपयोग करें और जब तक डेटा लोड हो जाता है कुछ समय के लिए एक ProgressDialog रखने के लिए। –

+1

आप आरएसएस रीडर को किसी सेवा (या तो एक एंड्रॉइड सेवा या एक साधारण सिंगलटन सेवा) में अलग क्यों नहीं कर सकते हैं जो ऐप प्रारंभिक पर फ़ीड्स लोड करना शुरू कर देता है? अलग-अलग दृश्य और मॉडल तर्क आमतौर पर सलाह दी जाती है। – jkschneider

उत्तर

1

आप गतिविधि की OnCreate समारोह में Asyc टास्क http://developer.android.com/reference/android/os/AsyncTask.html उपयोग करने के लिए:

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

public class RetrieveRssAsync { 


     public RetrieveRssAsync(Context ct,EVRequestCallback gt) 
     { 

     } 

      public static abstract class EVRequestCallback { 
       public abstract void requestDidFail(ArrayList<EventItem> ei); 
       public abstract void requestDidLoad(ArrayList<EventItem> ei); 
      } 
      public static class RetrieveEventFeeds extends AsyncTask<Void, Void, ArrayList<EventItem>> 
     { 
       Context mContext; 
       private EVRequestCallback mCallback; 
      public RetrieveEventFeeds(Context ct,EVRequestCallback gt) 
      { 
       mContext= ct; 
       mCallback=gt; 
      } 
      private ProgressDialog progress = null; 

      @Override 
      protected ArrayList<EventItem> doInBackground(Void... params) { 

       return retrieveRSSFeed("--URL of RSS here--",this.mContext); 


      } 

      @Override 
      protected void onCancelled() { 
       super.onCancelled(); 
      } 

      @Override 
      protected void onPreExecute() { 
       progress = ProgressDialog.show(
         mContext, null, "Loading ...",true,true); 

       super.onPreExecute(); 
      } 

      @Override 
      protected void onPostExecute(ArrayList<EventItem> result) { 
      //setListAdapter(); 
       mCallback.requestDidLoad(result); 
       progress.dismiss(); 
       //Toast.makeText(this.mContext, "current done", Toast.LENGTH_SHORT).show(); 
       super.onPostExecute(result); 
      } 

      @Override 
      protected void onProgressUpdate(Void... values) { 
       super.onProgressUpdate(values); 
      } 
     } 


    } 
+0

क्योंकि मैंने async beofore का उपयोग नहीं किया है, मैं मुश्किल से आपके कोड को समझता हूं। ऊपर कोड है जिसे लोड करने की आवश्यकता है, आपको लगता है कि यदि आप इसके लिए अपडेट कर सकते हैं तो आप अपडेट कर सकते हैं? –

+0

यह सब वहाँ है! DoInBackground विधि में getFeed रखो! आपकी गतिविधि को EVRequestCallback को लागू करने की आवश्यकता है! कार्यान्वित विधि अनुरोधDidLoad अपडेट डिस्प्ले को कॉल करेगा और अनुरोध में DidFail उपयोगकर्ता को कुछ त्रुटि जानकारी के साथ सूचित करेगा। – MatejC

0

ब्लॉग "स्टाइलिंग एंड्रॉइड" पृष्ठभूमि कार्यों को कैसे करना है यह दिखाने के लिए विस्तृत उदाहरण प्रदान करता है। FYI करें।

लिंक:

स्टाइलिंग एंड्रॉयड> पृष्ठभूमि कार्य - भाग 1 - http://blog.stylingandroid.com/archives/833
स्टाइलिंग एंड्रॉयड - http://blog.stylingandroid.com/