Xamarinを使ってみた

今更ですが、Xamarinを使ってみました。
Xamarin: Build apps with C# and .NET for iOS, Android, Mac and Windows

簡単にいえば、C#で複数プラットフォームのネイティブアプリをコーディングできる開発環境です。
C#はJavaと比べてコードが簡潔に書ける傾向があるのでわりと魅力的です。
個人利用でサポートなし、アプリサイズ制限ありのSTARTERバージョンは無料です。
インストーラを起動するとJDKやAndroid SDK等の必要なコンポーネントが自動で全てインストールされます。
(もともとインストール済みであればスキップされます)


で、とりあえずAndroidでHTTP GETするだけのアプリを書いてみました。
.NetのSystem.Net.HttpWebRequestと、JavaのJava.Net.HttpURLConnectionで指定したURLからHTTP GETするだけのアプリです。

C#だからコードが簡潔
var button = FindViewById<button>(Resource.Id.myButton);
button.Click += (sender, e) => {
    GetDataByHttpWebRequest(input.Text);
};

handler = new Handler(ApplicationContext.MainLooper);
何と言ってもイベントハンドラの実装がきれいです。
JavaでsetOnClickListener(new OnClickListener(){... と毎回書くのは実に面倒です。
また、プロパティが使えるのも大きいです。
getApplicationContext().getMainLooper() などと書く必要はありません。


HttpWebRequestとHttpURLConnectionで同じ動作を実装する
private void GetDataByHttpURLConnection (string url)
{
    var reqThread = new Thread (() => {
        var conn = new URL (url).OpenConnection () as HttpURLConnection;
        conn.SetRequestProperty ("User-Agent", "HttpURLConnection");
        conn.Connect ();
        if (HttpStatus.Ok == conn.ResponseCode) {
            using (var reader = new BufferedReader (new InputStreamReader (conn.InputStream))) {
                var result = "";
                string tmp;
                while ((tmp = reader.ReadLine ()) != null) {
                    result += tmp + "\n";
                }
                UpdateResult (result);
            }
        } else {
            UpdateResult (conn.ResponseCode.ToString ());
        }
    });
    reqThread.Start ();
}

private void GetDataByHttpWebRequest (string url)
{
    var req = HttpWebRequest.Create (new Uri(url)) as HttpWebRequest;
    req.Method = "GET";
    req.UserAgent = "HttpWebRequest";
    req.BeginGetResponse((ar) => {
        try {
            var res = (ar.AsyncState as HttpWebRequest).EndGetResponse(ar) as HttpWebResponse;
            if (res.StatusCode == HttpStatusCode.OK) {
                using (var reader = new StreamReader (res.GetResponseStream())) {
                    var body = reader.ReadToEnd();
                    UpdateResult(body);
                }
            } else {
                UpdateResult (res.StatusCode.ToString());
            }
        } catch (WebException e) {
            UpdateResult ("WebException: " + e.Status.ToString());
        }
    }, req);
}
HttpWebRequestが非同期実装なのに対してHttpURLConnectionが同期実装という以外はあまり差が無いです。
HttpURLConnection側でもusingが使えるのでストリームのclose処理をしなくていいのはJavaと比べるとかなり楽です。

で、同じ動作を実現することが出来ました。
もちろん、UIの更新をするにはUIスレッドに載せ替える必要があるのでHandlerにpostする必要があります。
private void UpdateResult (string value)
{
    handler.Post (() => {
        resultView.Text = value;
    });
}
new Runnable()... と書く必要は(ry
setText(... と書く必要は(ry

と、ここまで書きましたが着地点は考えてませんでした

おわり。

コメント

このブログの人気の投稿

Lumia 920買った - LTE有効化と開発端末登録

Android で Unicode絵文字入力

Nexus 5 買った