2011-11-19 102 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