ページ遷移を考慮した、時間のかかる複数データダウンロード処理 – Windows Phone 7+Twitterを例に

一つ前の投稿で、時間のかかるデータダウンロード一発こっきりのケースを説明しましたが、その続きです。 Twitterでは、膨大な量の項目を”カーソル”を利用してダウンロードしていくAPIを持っています。             var friendsUri = new Uri(“http://api.twitter.com/1/statuses/followers/” + targetUsername + “.xml?cursor=” + cursor);            var twitter = new WebClient();            twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(twitter_FollowersDownloadCompleted);            twitter.DownloadStringAsync(friendsUri); 前回の投稿でも似たようなコードが出てきましたが、DownloadStringAsync()メソッドの引数のUriにカーソルの値を追加すると、最大100項目ずつダウンロードが可能です。cursorを”-1”と指定すると最初の100個が取得できます。そして、イベントハンドラのコードで、e.ResultをXElementでParseした結果に対し、             string cursor = message.Descendants(“next_cursor”).First().Value; で、次に続く百項目を取り出す為のカーソルを取得できます。この値を使って逐次非同期ダウンロードを繰り返していくと、全ての項目がきちんと(Twitter APIは単位時間当たりの使用制限があるのでそれを超えなければの話ですが)ダウンロードできます。次に続く項目はない場合、カーソルは”0”になります。 更に、毎度ダウンロードが終わった時点で、各時点のカーソル値とひも付けてダウンロードした内容をファイル化しておけば、逐次ダウンロードの途中で、アプリが終了され、再開した時にも、保存したファイルを辿っていって、ファイル化されていないところからダウンロードを始めれば、処理に無駄がありません。まとめたコードを以下に紹介します。     string targetUsername;                // 調査対象のユーザーアカウント名は事前に代入しておく     GetFollowersData(string cursor)  // OnNavigatedToや、ボタン、タップのハンドラーで、cursorを””にしてコール    {        string fileName = “followers” + targetUsername + cursor + “.xml”;        var storage = IsolatedStorageFile.GetUserStorageForApplication();        if…

0

ページ遷移を考慮した、時間がかかるデータダウンロード処理 – Windows Phone 7+Twitterを例に

Windows Phone 7では下に並んだ3つのボタンでいつでもページ遷移ができます。Twitterなどネットからデータをダウンロードするのに時間がかかる場合、当然、ダウンロード処理中にページ遷移が起こり得ます。TwitterのREST APIでデータをロードする場合、WebClientというクラスを使います。例えば、あるユーザーアカウントのフォロワーのリストを取得する場合には、             var friendsUri = new Uri(“http://api.twitter.com/1/statuses/followers/” + targetUsername + “.xml” );            var twitter = new WebClient();            twitter.DownloadStringCompleted +=                    new DownloadStringCompletedEventHandler(twitter_FollowersDownloadCompleted);            twitter.DownloadStringAsync(friendsUri); というコードでWebClientクラスのDownloadStringCompletedイベントにハンドラを登録し、DownloadStringAsync()メソッドでデータロードを開始して、データロードが終わったらtwitter_FollowersDownloadComplatedメソッドがコールされるというように、非同期APIを使います。ちなみにハンドラ側では、         void twitter_FollowersDownloadCompleted(object sender, DownloadStringCompletedEventArgs e)        {            XElement message = XElement.Parse(e.Result);            var query = from m in message.Descendants(“user”)                        select new TwitterUser                        {                            Id = m.Element(“id”).Value,                            UserName = m.Element(“name”).Value,                            ScreenName…

0