2011-11-19 22 views
6

Busqué en todas partes esto, pero nadie parece tener una respuesta.¿Cómo precargar una actividad?

Mi pregunta es sencilla:

¿Hay una manera de cargar previamente una actividad? Necesito esto porque utilizo una pestaña, y una pestaña tiene múltiples actividades. Una de mis actividades es un lector de rss, y carga bastante duro (unos 2-3 segundos).

Todo lo que encontré en la web es una broma. Todos tienen una opinión, pero nadie puede indicarle un código de muestra. Esperando una respuesta, gracias!

Este es el código que carga la alimentación:

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

Es mejor usar AsyncTask y tener un ProgressDialog durante algún tiempo hasta que los datos se carga. –

+1

¿Por qué no se puede separar el lector de RSS en un servicio (ya sea un servicio de Android o un simple servicio de singleton) que comienza a cargar los feeds en la inicialización de la aplicación? La vista separada y la lógica del modelo son generalmente recomendables. – jkschneider

Respuesta

1

Usted tiene que usar ASYC Tarea http://developer.android.com/reference/android/os/AsyncTask.html en la función OnCreate de la actividad. Y recuerda que tienes que crear una interfaz (aquí utilicé EVRequestCallback) por la cual necesitas actualizar la UI de la Actividad después de completar la carga de rss. A continuación se muestra el código de muestra de la tarea Async para la alimentación 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

porque no usé asincrónicamente, apenas entiendo tu código. Arriba está el código que debe cargarse, ¿cree que puede actualizar si es así? –

+0

¡Está todo allí! ¡Ponga getFeed en el método doInBackground! ¡Su actividad necesita implementar EVRequestCallback! El método implementado requestDidLoad llamará a updateDisplay y al usuario de informe requestDidFail con alguna información de error. – MatejC

Cuestiones relacionadas