SlideShare une entreprise Scribd logo
1  sur  27
Télécharger pour lire hors ligne
Androidの通信周りの
コーディングについて
私です
名前 : 高木翔一
会社 : 株式会社ディディアイディ
Twitter : @fly1ncu
blog : 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;
private String placeName;
public void setId(int id) {
this.id = id;
}
public void getId() {
return id;
}
// (省略)
} 	
JSON
POJO
パース(デシリアイズ)
シリアライズ
パーサーを書く
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クラスが準備されている
要素が増えてくるとめんどくさい (´Д`)
パーサーを書かない
オープンソースライブラリをつかうとパーサー書かなくてもいい
• JsonPullParser
• GSON
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にマーカーアノテーションをつけるだけ!
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
マルチスレッドプログラミングの必要性
マルチスレッドプログラミングの必要性
•  AndroidはUIスレッドで通信できない
–  昔はできたのよ。やらないけど
•  別スレッドで通信しなきゃ
•  UIスレッド以外ではUIを変更できない
•  UIスレッドで終了時のUI変更しなきゃ
通信部分のバックグラウンド処理
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);
}
}
}	
ネスト多くねー?(#^ω^)
UIスレッドの処理
private void onDownloaded(final Meeting meeting) {
// Activity#runOnUiThread
runOnUiThread(new Runnable {
@Override
public void run() {
mProgresDialog.dismiss(); // プログレスダイアログを消す
setMeeting(meeting);
}
}
}	
ネスト多くねー?(#^ω^)
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);
}
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);
}
AndroidAsynchrousHttpを使う
// UIスレッドでコールする
AsyncHttpClient client = new AsyncHttpClient();
client.get(“http://hoge.jp”, new AsyncHttpResponseHandler {
@Override
public void onSuccess(String response) {
// このなかはUIスレッド
progressDialog.dismiss();
}
});
クラス分割したときのクラス間の処理
クラス分割したときのクラス間の処理
通信部分を別クラスにすると通信終了時に
元のクラスになんか合図したいよね
強結合での実装
public class DownloadTask{
public void execute(MainActivity mainActivity) {
// (略) 通信の処理とか
mainActivity.onDownloaded();
}
} 	
元のクラスを引数にして、メソッドをコールする
コールバックでの実装
public class DownloadTask{
public interface CallBack {
void onDownloaded();
}
public void execute(CallBack callBack) {
// (略) 通信の処理とか
if (null != callback) {
callback.onDownloaded();
}
}
}
コールバックでの実装
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() {
// (略) ダウンロード後の処理とか
}
});
}
}
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がリセットされた時によびだされる	
}
}
AsyncTaskLoaderでの実装
public class MeetingLoader extends
AsyncTaskLoader<Meeting> {
//省略
@Override
public List<Meeting> loadInBackground() {
Meeting meeting;
// ダウンロード処理など
return meeting;
}
}
エラー処理はガンバル&めんどくさがらない
try {
downloadTask();
} catch (Exception e) {}	
やめてください
エラー処理
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();
}
}
}
}
ご清聴ありがとうございました

Contenu connexe

Tendances

T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generatorOda Shinsuke
 
後期第六回ネットワークチーム講座資料
後期第六回ネットワークチーム講座資料後期第六回ネットワークチーム講座資料
後期第六回ネットワークチーム講座資料densan_teacher
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
RとSQLiteによるオミックス解析の促進
RとSQLiteによるオミックス解析の促進RとSQLiteによるオミックス解析の促進
RとSQLiteによるオミックス解析の促進弘毅 露崎
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~JustSystems Corporation
 
リーダブルコード勉強会
リーダブルコード勉強会リーダブルコード勉強会
リーダブルコード勉強会TAKUYA YAMAMOTO
 
Rの初歩: 5. 入出力
Rの初歩: 5. 入出力Rの初歩: 5. 入出力
Rの初歩: 5. 入出力Teiko Suzuki
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-uedayou
 
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack TangCODE BLUE
 
nakameguro_feature.cpp vol.8
nakameguro_feature.cpp vol.8nakameguro_feature.cpp vol.8
nakameguro_feature.cpp vol.8yohhoy
 
リーダブルコードが良書だったのでまとめました
リーダブルコードが良書だったのでまとめましたリーダブルコードが良書だったのでまとめました
リーダブルコードが良書だったのでまとめましたTakumi Sato
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)Shoji Haraguchi
 
20140903groonga発表資料
20140903groonga発表資料20140903groonga発表資料
20140903groonga発表資料Hironobu Saitoh
 

Tendances (19)

はじめてのMongoDB
はじめてのMongoDBはじめてのMongoDB
はじめてのMongoDB
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generator
 
mishimasyk#4
mishimasyk#4mishimasyk#4
mishimasyk#4
 
Lombok java
Lombok javaLombok java
Lombok java
 
named_scope more detail
named_scope more detailnamed_scope more detail
named_scope more detail
 
Yadis/XRI and OpenID
Yadis/XRI and OpenIDYadis/XRI and OpenID
Yadis/XRI and OpenID
 
後期第六回ネットワークチーム講座資料
後期第六回ネットワークチーム講座資料後期第六回ネットワークチーム講座資料
後期第六回ネットワークチーム講座資料
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
RとSQLiteによるオミックス解析の促進
RとSQLiteによるオミックス解析の促進RとSQLiteによるオミックス解析の促進
RとSQLiteによるオミックス解析の促進
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
 
リーダブルコード勉強会
リーダブルコード勉強会リーダブルコード勉強会
リーダブルコード勉強会
 
Rの初歩: 5. 入出力
Rの初歩: 5. 入出力Rの初歩: 5. 入出力
Rの初歩: 5. 入出力
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
 
Pakena #9
Pakena #9Pakena #9
Pakena #9
 
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
 
nakameguro_feature.cpp vol.8
nakameguro_feature.cpp vol.8nakameguro_feature.cpp vol.8
nakameguro_feature.cpp vol.8
 
リーダブルコードが良書だったのでまとめました
リーダブルコードが良書だったのでまとめましたリーダブルコードが良書だったのでまとめました
リーダブルコードが良書だったのでまとめました
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
 
20140903groonga発表資料
20140903groonga発表資料20140903groonga発表資料
20140903groonga発表資料
 

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

Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
Html5 Web Applications
Html5  Web ApplicationsHtml5  Web Applications
Html5 Web Applicationstotty jp
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義JPCERT Coordination Center
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter IntegrationKazuki Nakajima
 
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~decode2016
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術Koichi Fujikawa
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2Atsuo Yamasaki
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性JPCERT Coordination Center
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るKiyoshi SATOH
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio CodeAkira Inoue
 

Similaire à Androidの通信周りのコーディングについて (20)

Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
Html5 Web Applications
Html5  Web ApplicationsHtml5  Web Applications
Html5 Web Applications
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
 
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
 
OSC京都2011
OSC京都2011OSC京都2011
OSC京都2011
 
Teclab3
Teclab3Teclab3
Teclab3
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
 
DeclarativeSql
DeclarativeSqlDeclarativeSql
DeclarativeSql
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio Code
 

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