如何预加载一个Activity?

6

我到处搜索,但似乎没有人能回答我的问题。

我简单的问题是:

有没有一种方法可以预加载一个活动?我需要这样做是因为我使用了一个选项卡,而且一个选项卡有多个活动。我的一个活动是一个RSS阅读器,它加载得非常慢(大约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);

        }

最好使用AsyncTask并保持ProgressDialog一段时间,直到数据加载完成。 - Lalit Poptani
1
为什么不能将RSS阅读器分离成一个服务(可以是Android服务或简单的单例服务),在应用程序初始化时开始加载订阅源?通常建议将视图和模型逻辑分开。 - Jonathan Schneider
2个回答

1

你需要在Activity的OnCreate函数中使用AsyncTask http://developer.android.com/reference/android/os/AsyncTask.html。并且记得你需要创建一个接口(这里我使用了EVRequestCallback),通过它来在RSS加载完成后更新Activity的UI。下面是用于RSS feed的AsyncTask示例代码。

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);
            }
        }


    }

因为我以前没有使用过异步,所以我几乎不理解你的代码。上面是需要加载的代码,你认为你能更新它吗? - Milky Way
都在这里了!把getFeed放到doInBackground方法中!你的活动需要实现EVRequestCallback!已实现的requestDidLoad方法将调用updateDisplay,在requestDidFail中使用一些错误信息通知用户。 - MatejC

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接