2011-11-19 103 views
6

我到處搜索這個,但沒有人似乎有答案。如何預加載活動?

我的簡單問題是:

有沒有預加載活動的方法?我需要這個,因爲我使用一個選項卡,並且選項卡有多個活動。我的一項活動是一個rss閱讀器,加載非常困難(大約2-3秒)。

我在網上發現的所有內容都是一個笑話。大家都有意見,但沒有人能指出你的示例代碼。等待答案,謝謝!

這是加載進代碼:你必須使用ASYC任務http://developer.android.com/reference/android/os/AsyncTask.html在活動的OnCreate功能

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

爲什麼你不能將RSS閱讀器分成一個服務(一個Android服務或一個簡單的單件服務),它開始在應用程序初始化時加載這些提要?分離視圖和模型邏輯通常是可取的。 – jkschneider

回答

1

。 並記住你必須創建一個接口(在這裏我使用EVRequestCallback),通過它你需要在完成rss加載後更新Activity的UI。以下是RSS提要的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

,因爲我沒有使用異步beofore,我幾乎不瞭解你的代碼。上面是需要加載的代碼,你認爲你可以更新的代碼? –

+0

它就在那裏!把getFeed放在doInBackground方法中!您的活動需要實施EVRequestCallback!實現的方法requestDidLoad將調用updateDisplay並在requestDidFail informe用戶中輸入一些錯誤信息。 – MatejC