Upload
Download free for 30 days
Login
Submit Search
Androidの通信周りのコーディングについて
63 likes
8,906 views
Shoichi Takagi
1 of 27
Download now
Downloaded 75 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
More Related Content
PDF
Ecmascript2015とその周辺について
豊明 尾古
PPTX
LINQ 概要 + 結構便利な LINQ to XML
ShinichiAoyagi
PDF
5分でわかったつもりになるParse.com
Kenta Tsuji
PDF
Android Lecture #03 @PRO&BSC Inc.
Yuki Higuchi
PDF
明日から使える Java SE 7
Yuichi Sakuraba
PDF
20180123 power shell
Trainocate Japan, Ltd.
PPTX
Scala 初心者向けlt
Keigo Magami
PDF
OpenStack Study#9 JOSUG
Hideki Saito
Ecmascript2015とその周辺について
豊明 尾古
LINQ 概要 + 結構便利な LINQ to XML
ShinichiAoyagi
5分でわかったつもりになるParse.com
Kenta Tsuji
Android Lecture #03 @PRO&BSC Inc.
Yuki Higuchi
明日から使える Java SE 7
Yuichi Sakuraba
20180123 power shell
Trainocate Japan, Ltd.
Scala 初心者向けlt
Keigo Magami
OpenStack Study#9 JOSUG
Hideki Saito
What's hot
(19)
PDF
はじめてのMongoDB
Keisuke Izumiya
PPTX
T sql の parse と generator
Oda Shinsuke
PDF
mishimasyk#4
Takayuki Serizawa
PDF
Lombok java
Takumi Murano
PDF
named_scope more detail
Kyosuke MOROHASHI
PPT
Yadis/XRI and OpenID
Toru Yamaguchi
PDF
後期第六回ネットワークチーム講座資料
densan_teacher
PDF
Apache Torqueについて
tako pons
PDF
RとSQLiteによるオミックス解析の促進
弘毅 露崎
PPTX
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
JustSystems Corporation
PDF
リーダブルコード勉強会
TAKUYA YAMAMOTO
PDF
Rの初歩: 5. 入出力
Teiko Suzuki
PDF
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
uedayou
PDF
Pakena #9
(^-^) togakushi
PPTX
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
CODE BLUE
PDF
nakameguro_feature.cpp vol.8
yohhoy
PPTX
リーダブルコードが良書だったのでまとめました
Takumi Sato
PDF
DTrace for biginners part(2)
Shoji Haraguchi
PPTX
20140903groonga発表資料
Hironobu Saitoh
はじめてのMongoDB
Keisuke Izumiya
T sql の parse と generator
Oda Shinsuke
mishimasyk#4
Takayuki Serizawa
Lombok java
Takumi Murano
named_scope more detail
Kyosuke MOROHASHI
Yadis/XRI and OpenID
Toru Yamaguchi
後期第六回ネットワークチーム講座資料
densan_teacher
Apache Torqueについて
tako pons
RとSQLiteによるオミックス解析の促進
弘毅 露崎
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
JustSystems Corporation
リーダブルコード勉強会
TAKUYA YAMAMOTO
Rの初歩: 5. 入出力
Teiko Suzuki
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
uedayou
Pakena #9
(^-^) togakushi
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
CODE BLUE
nakameguro_feature.cpp vol.8
yohhoy
リーダブルコードが良書だったのでまとめました
Takumi Sato
DTrace for biginners part(2)
Shoji Haraguchi
20140903groonga発表資料
Hironobu Saitoh
Ad
Similar to Androidの通信周りのコーディングについて
(20)
PPTX
Androidアプリケーション応用 WebAPI開発
OESF Education
PDF
Rx java x retrofit
Shun Nakahara
PDF
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
PPTX
Androidで使えるJSON-Javaライブラリ
Yukiya Nakagawa
PPTX
つぶLT20121215
遼一 杉浦
PPT
Android Hacks - Hack18 ~ Hack20
Masanori Ohkawara
PDF
PerlとJavaScriptとAndroidとiOSとのんのんバアとオレ
Naosuke Yokoe
KEY
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
Makoto Setoh
PDF
LITメンター研修_Android0212
Ryo Yamamoto
PDF
【LiT Leaders】Android0309
Ryo Yamamoto
PPTX
An other world awaits you
信之 岩永
PDF
Tokyo GTUG Bootcamp2010
Takashi EGAWA
PPT
2008.10.18 L4u Tech Talk
mitamex4u
PPTX
歌舞伎座Tech Rx会
Kaora Shibacaki
PDF
ICT ERA + ABC 2012 Tohoku
Takashi EGAWA
PPTX
学生向けAndroid勉強会(入門編)
Itsuki Kuroda
PDF
Android T2 on cloud
Masaaki Yonebayashi
PPTX
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
Tusyoshi Matsuzaki
KEY
Ll xcode
Net Kanayan
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
Androidアプリケーション応用 WebAPI開発
OESF Education
Rx java x retrofit
Shun Nakahara
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
Androidで使えるJSON-Javaライブラリ
Yukiya Nakagawa
つぶLT20121215
遼一 杉浦
Android Hacks - Hack18 ~ Hack20
Masanori Ohkawara
PerlとJavaScriptとAndroidとiOSとのんのんバアとオレ
Naosuke Yokoe
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
Makoto Setoh
LITメンター研修_Android0212
Ryo Yamamoto
【LiT Leaders】Android0309
Ryo Yamamoto
An other world awaits you
信之 岩永
Tokyo GTUG Bootcamp2010
Takashi EGAWA
2008.10.18 L4u Tech Talk
mitamex4u
歌舞伎座Tech Rx会
Kaora Shibacaki
ICT ERA + ABC 2012 Tohoku
Takashi EGAWA
学生向けAndroid勉強会(入門編)
Itsuki Kuroda
Android T2 on cloud
Masaaki Yonebayashi
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
Tusyoshi Matsuzaki
Ll xcode
Net Kanayan
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
Ad
Androidの通信周りのコーディングについて
1.
Androidの通信周りの コーディングについて
2.
私です 名前 : 高木翔一 会社
: 株式会社ディディアイディ Twitter : @fly1ncu blog : 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; } // (省略) } JSON POJO パース(デシリアイズ) シリアライズ
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を使う @JsonModel public 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; } // (省略) } POJO private void parse(String json) { Meeting meeting = MeetingGen.get(json); } POJOにマーカーアノテーションをつけるだけ!
10.
XMLはSimpleがいいよ! @Root public 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 { @Override public 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#runOnUiThread runOnUiThread(new Runnable { @Override public void run() { mProgresDialog.dismiss(); // プログレスダイアログを消す setMeeting(meeting); } } } ネスト多くねー?(#^ω^)
15.
AndroidAnnotationsを使う @Background void 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); } @UiThread void onDownloaded(final Meeting meeting) { mProgresDialog.dismiss(); // プログレスダイアログを消す setMeeting(meeting); }
16.
AsyncTaskを使う private class DownloadTask
extends AsyncTask<String, Integer, Meeting> { ProgressDialog progressDialog; @Override protected void onPreExecute() { progressDialog = new ProgressDialog(SampleActivity.this); progressDialog.show(); } @Override protected 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); } @Override protected void onPostExecute(Meeting meeting) { progressDialog.dismiss(); setMeeting(meeting); }
17.
AndroidAsynchrousHttpを使う // UIスレッドでコールする AsyncHttpClient client
= new AsyncHttpClient(); client.get(“http://hoge.jp”, new AsyncHttpResponseHandler { @Override public 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 Activity impletents DownloadTask.Callback { private void startDownload() { new DownloadTask().execute(this); } @Override public void onDownloaded() { // (略) ダウンロード後の処理とか } } public class MainActivity extends Activity { private void startDownload() { new DownloadTask().execute(new DownloadTask.Callback { @Override public void onDownloaded() { // (略) ダウンロード後の処理とか } }); } }
23.
AsyncTaskLoaderでの実装 public class SampleActivity
extends Activity implements LoaderCallbacks<Meeting> { // 省略 @Override public Loader<Meeting> onCreateLoader(int id, Bundle args) { // 開始処理を書く MeetingLoader loader = new MeetingLoader(this); loader.forceLoad(); return loader; } @Override public void onLoadFinished(Loader<Meeting> loader, Meeting meeting) { // Loaderが終了すると呼ばれる } @Override public void onLoaderReset(Loader<Meeting> meeting) { // Loaderがリセットされた時によびだされる } }
24.
AsyncTaskLoaderでの実装 public class MeetingLoader
extends AsyncTaskLoader<Meeting> { //省略 @Override public 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.
ご清聴ありがとうございました
Download