2011-11-19 9 views
6

私はこれをどこでも検索しましたが、誰も答えがないようです。アクティビティをどのようにプリロードするのですか?

私の簡単な質問は:

アクティビティをプリロードする方法はありますか?私はタブを使い、タブは複数のアクティビティを持っているのでこれが必要です。私の活動の1つは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); 

     } 
+0

良いです。 –

+1

RSSリーダーをアプリの初期化時にフィードの読み込みを開始するサービス(Androidサービスまたはシンプルシングルトンサービス)に分離できないのはなぜですか?ビューとモデルロジックを分離することが一般的に推奨されます。 – jkschneider

答えて

1

あなたは活動のOnCreateの機能にAsycタスクhttp://developer.android.com/reference/android/os/AsyncTask.htmlを使用する必要があります。 そして、あなたがrssの読み込みの完了後にアクティビティのUIを更新する必要があるインターフェース(ここではEVRequestCallbackを使用しました)を作成しなければならないことに注意してください。以下は、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

私は非同期を使用しなかったので、私はほとんどあなたのコードを理解しています。上記のコードはロードする必要があります、あなたはそれについて更新することができると思いますか? –

+0

すべてあります! getFeedをdoInBackgroundメソッドに入れてください!アクティビティにEVRequestCallbackを実装する必要があります。実装されたメソッドrequestDidLoadはupdateDisplayを呼び出し、requestDidFailではいくつかのエラー情報を通知します。 – MatejC

0

「Androidをスタイリングする」というブログは、バックグラウンドタスクの実行方法を示す詳細な例を提供します。 FYI。

リンク:

スタイリングのAndroid>バックグラウンドタスク - パート1からhttp://blog.stylingandroid.com/archives/833
スタイリングアンドロイド - AsyncTaskを使用してデータがロードされるまでしばらくの間、ProgressDialogを維持するhttp://blog.stylingandroid.com/

関連する問題