Xamarin.Forms HttpClientで超シンプルにダウンロードする
1 HttpClient
Xamarin.Formsの非同期サポートのページでは、HttpClientを使用したサンプルが掲載されており、ソースコードには、「Xamarin supports HttpClient!」って書いています。
http://developer.xamarin.com/guides/cross-platform/advanced/async_support_overview/
しかし、デフォルトの状態ではシンボルが見つからず、参照で追加すればいいのかと思いましたが、ターゲットが制約されてしまう旨の警告がでます。
ターゲットを絞るのであれば、Xamarin.Formsのメリットが大きく縮小してしまいます。
各ターゲットのプロジェクト内で使用してみると、iOSやAndroidでは使用できますが、どうやらWindowsPhoneで未対応のようです。
2 Microsoft.Net.Http
検索の結果、こちらを使用すれば行けるようです。
http://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable-httpclient-for-net-framework-and-windows-phone.aspx
「NuGet パッケージ管理」でHttpClientで検索してインストールします。
パッケージマネージャコンソールから「PM> Install-Package Microsoft.Net.Http」でもいけます。
参照を確認すると、System.Net.Httpの名前で追加されています。
※インストールは、共有プロジェクトだけでOKです。
3 async await
このHttpClientを async await で使用すれば、超シンプルに記述できます。さすがC#ですw
public class App { public static Page GetMainPage(){ return new MyPage(); } public class MyPage:ContentPage{ public MyPage(){ //ボタンとラベル(2つ)を配置する var button = new Button{Text = "Push"}; var status = new Label(); var html = new Label{ HorizontalOptions = LayoutOptions.StartAndExpand, VerticalOptions = LayoutOptions.StartAndExpand, LineBreakMode = LineBreakMode.WordWrap, Font = Font.SystemFontOfSize(NamedSize.Small), }; Content = new StackLayout { Spacing = 20, Children = { button, status, html } }; //ボタンを押した時の処理 button.Clicked += async (s, a) => { //ラベルの表示を初期化する status.Text = "Loding..."; html.Text = ""; //非同期でダウンロード var str = await Download(); //ダウンロード完了後にラベルを更新する status.Text = str.Length + " bytes downloaded"; html.Text = str; }; } async Task<String> Download(){ var httpClient = new HttpClient(); return await httpClient.GetStringAsync("http://www.sapporoworks.ne.jp/"); } } }
実行結果は次のようになりました。
Windows Phone | |
Android | |
iOS | |
※ダウンロードのbyte数が若干違うのは、途中でWebページを編集したからです。気にしないでください。