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#だからコードが簡潔
JavaでsetOnClickListener(new OnClickListener(){... と毎回書くのは実に面倒です。
また、プロパティが使えるのも大きいです。
getApplicationContext().getMainLooper() などと書く必要はありません。
HttpWebRequestとHttpURLConnectionで同じ動作を実装する
HttpURLConnection側でもusingが使えるのでストリームのclose処理をしなくていいのはJavaと比べるとかなり楽です。
で、同じ動作を実現することが出来ました。
もちろん、UIの更新をするにはUIスレッドに載せ替える必要があるのでHandlerにpostする必要があります。
setText(... と書く必要は(ry
と、ここまで書きましたが着地点は考えてませんでした
おわり。
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で同じ動作を実装する
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); }
HttpURLConnection側でもusingが使えるのでストリームのclose処理をしなくていいのはJavaと比べるとかなり楽です。
で、同じ動作を実現することが出来ました。
もちろん、UIの更新をするにはUIスレッドに載せ替える必要があるのでHandlerにpostする必要があります。
new Runnable()... と書く必要は(ryprivate void UpdateResult (string value) { handler.Post (() => { resultView.Text = value; }); }
setText(... と書く必要は(ry
と、ここまで書きましたが着地点は考えてませんでした
おわり。
コメント
コメントを投稿