Your SlideShare is downloading. ×
0
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

16,169

Published on

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

No Downloads
Views
Total Views
16,169
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
69
Comments
0
Likes
63
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Androidの通信周りのコーディングについて
  • 2. 私です名前 : 高木翔一会社 : 株式会社ディディアイディTwitter : @fly1ncublog : http://blog.fly1ncu.comスライドはアップロードするのであとでゆっくりみてね
  • 3. Activityに2000行も3000行も書かないでほしい(切実)
  • 4. 通信周りがすっきりしない4つの理由•  JSONやXMLのパースめんどい•  マルチスレッドプログラミングめんどい•  クラス分割うまくいかない•  エラー処理めんどい
  • 5. JSONやXMLのパース
  • 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. パーサーを書く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. パーサーを書かないオープンソースライブラリをつかうとパーサー書かなくてもいい• JsonPullParser• GSON
  • 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. 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. マルチスレッドプログラミングの必要性
  • 12. マルチスレッドプログラミングの必要性•  AndroidはUIスレッドで通信できない–  昔はできたのよ。やらないけど•  別スレッドで通信しなきゃ•  UIスレッド以外ではUIを変更できない•  UIスレッドで終了時のUI変更しなきゃ
  • 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. UIスレッドの処理private void onDownloaded(final Meeting meeting) {// Activity#runOnUiThreadrunOnUiThread(new Runnable {@Overridepublic void run() {mProgresDialog.dismiss(); // プログレスダイアログを消すsetMeeting(meeting);}}} ネスト多くねー?(#^ω^)
  • 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. 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. AndroidAsynchrousHttpを使う// UIスレッドでコールするAsyncHttpClient client = new AsyncHttpClient();client.get(“http://hoge.jp”, new AsyncHttpResponseHandler {@Overridepublic void onSuccess(String response) {// このなかはUIスレッドprogressDialog.dismiss();}});
  • 18. クラス分割したときのクラス間の処理
  • 19. クラス分割したときのクラス間の処理通信部分を別クラスにすると通信終了時に元のクラスになんか合図したいよね
  • 20. 強結合での実装public class DownloadTask{public void execute(MainActivity mainActivity) {// (略) 通信の処理とかmainActivity.onDownloaded();}} 元のクラスを引数にして、メソッドをコールする
  • 21. コールバックでの実装public class DownloadTask{public interface CallBack {void onDownloaded();}public void execute(CallBack callBack) {// (略) 通信の処理とかif (null != callback) {callback.onDownloaded();}}}
  • 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. 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. AsyncTaskLoaderでの実装public class MeetingLoader extendsAsyncTaskLoader<Meeting> {//省略@Overridepublic List<Meeting> loadInBackground() {Meeting meeting;// ダウンロード処理などreturn meeting;}}
  • 25. エラー処理はガンバル&めんどくさがらないtry {downloadTask();} catch (Exception e) {} やめてください
  • 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. ご清聴ありがとうございました

×