SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin.Forms HttpClientで超シンプルにダウンロードする

【 Xamarin 記事一覧 】

1 HttpClient

Xamarin.Formsの非同期サポートのページでは、HttpClientを使用したサンプルが掲載されており、
ソースコードには、「Xamarin supports HttpClient!」って書いています。
f:id:furuya02:20141005051743p:plain:w500
http://developer.xamarin.com/guides/cross-platform/advanced/async_support_overview/

f:id:furuya02:20141005051850p:plain
しかし、デフォルトの状態ではシンボルが見つからず、参照で追加すればいいのかと思いましたが、ターゲットが制約されてしまう旨の警告がでます。
ターゲットを絞るのであれば、Xamarin.Formsのメリットが大きく縮小してしまいます。
各ターゲットのプロジェクト内で使用してみると、iOSAndroidでは使用できますが、どうやらWindowsPhoneで未対応のようです。

f:id:furuya02:20141005051944p:plain:w500

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」でもいけます。
f:id:furuya02:20141005052018p:plain:w500

参照を確認すると、System.Net.Httpの名前で追加されています。

f:id:furuya02:20141005052027p:plain

※インストールは、共有プロジェクトだけで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
f:id:furuya02:20141005052608p:plain:w250:left f:id:furuya02:20141005054900p:plain:w250:left
Android
f:id:furuya02:20141005052611p:plain:w250:left f:id:furuya02:20141005052613p:plain:w250:left
iOS
f:id:furuya02:20141005052614p:plain:w250:left f:id:furuya02:20141005052616p:plain:w250:left

※ダウンロードのbyte数が若干違うのは、途中でWebページを編集したからです。気にしないでください。


【 Xamarin 記事一覧 】