Androidの通信周りのコーディングについて
私です名前 : 高木翔一会社 : 株式会社ディディアイディTwitter : @fly1ncublog : http://blog.fly1ncu.comスライドはアップロードするのであとでゆっくりみてね
Activityに2000行も3000行も書かないでほしい(切実)
通信周りがすっきりしない4つの理由•  JSONやXMLのパースめんどい•  マルチスレッドプログラミングめんどい•  クラス分割うまくいかない•  エラー処理めんどい
JSONやXMLのパース
JSONやXMLのパース{“id” : 0,“name” : “tsubu”,“place_name” : “a-team”}	public class Meeting {private int id;private String name;p...
パーサーを書くpublic class MeetingParser {private interface Key {String ID = “id”,String NAME = “name”,String PLACE_NAME = “place...
パーサーを書かないオープンソースライブラリをつかうとパーサー書かなくてもいい• JsonPullParser• GSON
JsonPullParserを使う@JsonModelpublic class Meeting {@JsonKey private int id;@JsonKey private String name;@JsonKey private Str...
XMLはSimpleがいいよ!@Rootpublic class Meeting {@Element private int id;@Element private String name;@Element private String pla...
マルチスレッドプログラミングの必要性
マルチスレッドプログラミングの必要性•  AndroidはUIスレッドで通信できない–  昔はできたのよ。やらないけど•  別スレッドで通信しなきゃ•  UIスレッド以外ではUIを変更できない•  UIスレッドで終了時のUI変更しなきゃ
通信部分のバックグラウンド処理private Handler mHandler = new Handler();private void downloadString(final String url) {mHandler.post(new R...
UIスレッドの処理private void onDownloaded(final Meeting meeting) {// Activity#runOnUiThreadrunOnUiThread(new Runnable {@Overridep...
AndroidAnnotationsを使う@Backgroundvoid downloadString(final String url) {HttpClient client = new DefaultHttpClient ();HttpGe...
AsyncTaskを使うprivate class DownloadTask extends AsyncTask<String, Integer, Meeting> {ProgressDialog progressDialog;@Overrid...
AndroidAsynchrousHttpを使う// UIスレッドでコールするAsyncHttpClient client = new AsyncHttpClient();client.get(“http://hoge.jp”, new Asy...
クラス分割したときのクラス間の処理
クラス分割したときのクラス間の処理通信部分を別クラスにすると通信終了時に元のクラスになんか合図したいよね
強結合での実装public class DownloadTask{public void execute(MainActivity mainActivity) {// (略) 通信の処理とかmainActivity.onDownloaded()...
コールバックでの実装public class DownloadTask{public interface CallBack {void onDownloaded();}public void execute(CallBack callBack)...
コールバックでの実装public class MainActivity extends Activityimpletents DownloadTask.Callback {private void startDownload() {new Do...
AsyncTaskLoaderでの実装public class SampleActivity extends Activity implementsLoaderCallbacks<Meeting> {// 省略	@Overridepublic ...
AsyncTaskLoaderでの実装public class MeetingLoader extendsAsyncTaskLoader<Meeting> {//省略@Overridepublic List<Meeting> loadInBac...
エラー処理はガンバル&めんどくさがらないtry {downloadTask();} catch (Exception e) {}	やめてください
エラー処理public class DownloadTask{public interface CallBack {void onDownloaded();void onDownloadFailured();}public void execu...
ご清聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

Androidの通信周りのコーディングについて

17,704 views

Published on

0 Comments
64 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
17,704
On SlideShare
0
From Embeds
0
Number of Embeds
548
Actions
Shares
0
Downloads
72
Comments
0
Likes
64
Embeds 0
No embeds

No notes for slide

Androidの通信周りのコーディングについて

  1. 1. Androidの通信周りのコーディングについて
  2. 2. 私です名前 : 高木翔一会社 : 株式会社ディディアイディTwitter : @fly1ncublog : http://blog.fly1ncu.comスライドはアップロードするのであとでゆっくりみてね
  3. 3. Activityに2000行も3000行も書かないでほしい(切実)
  4. 4. 通信周りがすっきりしない4つの理由•  JSONやXMLのパースめんどい•  マルチスレッドプログラミングめんどい•  クラス分割うまくいかない•  エラー処理めんどい
  5. 5. JSONやXMLのパース
  6. 6. JSONやXMLのパース{“id” : 0,“name” : “tsubu”,“place_name” : “a-team”} public class Meeting {private int id;private String name;private String placeName;public void setId(int id) {this.id = id;}public void getId() {return id;}// (省略)} JSONPOJOパース(デシリアイズ)シリアライズ
  7. 7. パーサーを書くpublic class MeetingParser {private interface Key {String ID = “id”,String NAME = “name”,String PLACE_NAME = “place_name”}public static Meeting parse(String json) {Meeting meeting = new Meeting();JsonObject jsonObject = new JsonObject(json);meeting.setId(jsonObject.getInt(Key.ID));meeging.setName(jsonObject.getString(Key.Name));meeting.setPlaceName(jsonObject.getString(Key.PLACE_NAME));return meeting;} Androidには標準でJsonObjectクラスが準備されている要素が増えてくるとめんどくさい (´Д`)
  8. 8. パーサーを書かないオープンソースライブラリをつかうとパーサー書かなくてもいい• JsonPullParser• GSON
  9. 9. JsonPullParserを使う@JsonModelpublic class Meeting {@JsonKey private int id;@JsonKey private String name;@JsonKey private String placeName;public void setId(int id) {this.id = id;}public void getId() {return id;}// (省略)} POJOprivate void parse(String json) {Meeting meeting = MeetingGen.get(json);} POJOにマーカーアノテーションをつけるだけ!
  10. 10. XMLはSimpleがいいよ!@Rootpublic class Meeting {@Element private int id;@Element private String name;@Element private String placeName;public void setId(int id) {this.id = id;}public void getId() {return id;}// (省略)} POJO
  11. 11. マルチスレッドプログラミングの必要性
  12. 12. マルチスレッドプログラミングの必要性•  AndroidはUIスレッドで通信できない–  昔はできたのよ。やらないけど•  別スレッドで通信しなきゃ•  UIスレッド以外ではUIを変更できない•  UIスレッドで終了時のUI変更しなきゃ
  13. 13. 通信部分のバックグラウンド処理private Handler mHandler = new Handler();private void downloadString(final String url) {mHandler.post(new Runnable {@Overridepublic void run() {HttpClient client = new DefaultHttpClient ();HttpGet httpGet = new HttpGet(url);HttpResponse httpResponse = client.execute(httpGet);String response;response = EntityUtils.toString(response.getEntity(), "UTF-8");// 文字列をパースするとかMeeting meeting = MeetingGen.get(response);onDownloaded(meeting);}}} ネスト多くねー?(#^ω^)
  14. 14. UIスレッドの処理private void onDownloaded(final Meeting meeting) {// Activity#runOnUiThreadrunOnUiThread(new Runnable {@Overridepublic void run() {mProgresDialog.dismiss(); // プログレスダイアログを消すsetMeeting(meeting);}}} ネスト多くねー?(#^ω^)
  15. 15. AndroidAnnotationsを使う@Backgroundvoid downloadString(final String url) {HttpClient client = new DefaultHttpClient ();HttpGet httpGet = new HttpGet(url);HttpResponse httpResponse = client.execute(httpGet);String response;response = EntityUtils.toString(response.getEntity(), "UTF-8");// 文字列をパースするとかfinal Meeting meeting = MeetingGen.get(response);onDownloaded(meeting);} @UiThreadvoid onDownloaded(final Meeting meeting) {mProgresDialog.dismiss(); // プログレスダイアログを消すsetMeeting(meeting);}
  16. 16. AsyncTaskを使うprivate class DownloadTask extends AsyncTask<String, Integer, Meeting> {ProgressDialog progressDialog;@Overrideprotected void onPreExecute() {progressDialog = new ProgressDialog(SampleActivity.this);progressDialog.show();}@Overrideprotected String doInBackground(String... params) {HttpClient client = new DefaultHttpClient();HttpGet httpGet = new HttpGet(url);HttpResponse httpResponse = client.execute(httpGet);String response;response = EntityUtils.toString(response.getEntity(), "UTF-8");return MeetingGen.get(response);}@Overrideprotected void onPostExecute(Meeting meeting) {progressDialog.dismiss();setMeeting(meeting);}
  17. 17. AndroidAsynchrousHttpを使う// UIスレッドでコールするAsyncHttpClient client = new AsyncHttpClient();client.get(“http://hoge.jp”, new AsyncHttpResponseHandler {@Overridepublic void onSuccess(String response) {// このなかはUIスレッドprogressDialog.dismiss();}});
  18. 18. クラス分割したときのクラス間の処理
  19. 19. クラス分割したときのクラス間の処理通信部分を別クラスにすると通信終了時に元のクラスになんか合図したいよね
  20. 20. 強結合での実装public class DownloadTask{public void execute(MainActivity mainActivity) {// (略) 通信の処理とかmainActivity.onDownloaded();}} 元のクラスを引数にして、メソッドをコールする
  21. 21. コールバックでの実装public class DownloadTask{public interface CallBack {void onDownloaded();}public void execute(CallBack callBack) {// (略) 通信の処理とかif (null != callback) {callback.onDownloaded();}}}
  22. 22. コールバックでの実装public class MainActivity extends Activityimpletents DownloadTask.Callback {private void startDownload() {new DownloadTask().execute(this);}@Overridepublic void onDownloaded() {// (略) ダウンロード後の処理とか}} public class MainActivity extends Activity {private void startDownload() {new DownloadTask().execute(new DownloadTask.Callback {@Overridepublic void onDownloaded() {// (略) ダウンロード後の処理とか}});}}
  23. 23. AsyncTaskLoaderでの実装public class SampleActivity extends Activity implementsLoaderCallbacks<Meeting> {// 省略 @Overridepublic Loader<Meeting> onCreateLoader(int id, Bundle args) {// 開始処理を書くMeetingLoader loader = new MeetingLoader(this); loader.forceLoad();return loader;}@Overridepublic void onLoadFinished(Loader<Meeting> loader, Meeting meeting) {// Loaderが終了すると呼ばれる }@Overridepublic void onLoaderReset(Loader<Meeting> meeting) {// Loaderがリセットされた時によびだされる }}
  24. 24. AsyncTaskLoaderでの実装public class MeetingLoader extendsAsyncTaskLoader<Meeting> {//省略@Overridepublic List<Meeting> loadInBackground() {Meeting meeting;// ダウンロード処理などreturn meeting;}}
  25. 25. エラー処理はガンバル&めんどくさがらないtry {downloadTask();} catch (Exception e) {} やめてください
  26. 26. エラー処理public class DownloadTask{public interface CallBack {void onDownloaded();void onDownloadFailured();}public void execute(CallBack callBack) {try {// (略) 通信の処理とかif (null != callback) {callback.onDownloaded();}} catch (Exception e) {if (null != callback) (callback.onDownloadFailured();}}}}
  27. 27. ご清聴ありがとうございました

×