2011-11-19 12 views
6

Ho cercato dappertutto questo, ma nessuno sembra avere una risposta.Come precaricare un'attività?

mia semplice domanda è:

Esiste un modo per precaricare un'attività? Ho bisogno di questo perché uso una scheda e una scheda ha più attività. Una delle mie attività è un lettore di rss, che carica abbastanza duramente (circa 2-3 secondi).

Tutto quello che ho trovato sul Web è uno scherzo. Ognuno ha un'opinione, ma nessuno può indicarti un codice di esempio. In attesa di una risposta, grazie!

Questo è il codice che carica il feed:

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

Meglio usare AsyncTask e tenere un ProgressDialog per qualche tempo fino a quando i dati viene caricato. –

+1

Perché non si può separare il lettore RSS in un servizio (un servizio Android o un semplice servizio Singleton) che inizia a caricare i feed sull'inizializzazione dell'app? È generalmente consigliabile separare la vista e la logica del modello. – jkschneider

risposta

1

Devi usare ASYC Task http://developer.android.com/reference/android/os/AsyncTask.html nella funzione OnCreate dell'attività. E ricorda che devi creare un'interfaccia (qui ho usato EVRequestCallback) con cui devi aggiornare l'interfaccia utente dell'attività dopo il completamento del caricamento di rss. Di seguito è riportato il codice di esempio dell'attività Async per il feed RSS.

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

perché non ho usato async prima, capisco a malapena il tuo codice. Sopra è il codice che deve essere caricato, pensi di poter aggiornare se per quello? –

+0

È tutto lì! Inserisci getFeed nel metodo doInBackground! La tua attività deve implementare EVRequestCallback! Il metodo implementato requestDidLoad chiamerà updateDisplay e in requestDidFail informa l'utente con alcune informazioni di errore. – MatejC

Problemi correlati