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();
}
}
}
}
ご清聴ありがとうございました

More Related Content

PDF
Ecmascript2015とその周辺について
PPTX
LINQ 概要 + 結構便利な LINQ to XML
PDF
5分でわかったつもりになるParse.com
PDF
Android Lecture #03 @PRO&BSC Inc.
PDF
明日から使える Java SE 7
PDF
20180123 power shell
PPTX
Scala 初心者向けlt
PDF
OpenStack Study#9 JOSUG
Ecmascript2015とその周辺について
LINQ 概要 + 結構便利な LINQ to XML
5分でわかったつもりになるParse.com
Android Lecture #03 @PRO&BSC Inc.
明日から使える Java SE 7
20180123 power shell
Scala 初心者向けlt
OpenStack Study#9 JOSUG

What's hot (19)

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

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

PPTX
Androidアプリケーション応用 WebAPI開発
PDF
Rx java x retrofit
PDF
Reactive Extensionsで非同期処理を簡単に
PPTX
Androidで使えるJSON-Javaライブラリ
PPTX
つぶLT20121215
PPT
Android Hacks - Hack18 ~ Hack20
PDF
PerlとJavaScriptとAndroidとiOSとのんのんバアとオレ
KEY
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
PDF
LITメンター研修_Android0212
PDF
【LiT Leaders】Android0309
PPTX
An other world awaits you
PDF
Tokyo GTUG Bootcamp2010
PPT
2008.10.18 L4u Tech Talk
PPTX
歌舞伎座Tech Rx会
PDF
ICT ERA + ABC 2012 Tohoku
PPTX
学生向けAndroid勉強会(入門編)
PDF
Android T2 on cloud
PPTX
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
KEY
Ll xcode
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
Androidアプリケーション応用 WebAPI開発
Rx java x retrofit
Reactive Extensionsで非同期処理を簡単に
Androidで使えるJSON-Javaライブラリ
つぶLT20121215
Android Hacks - Hack18 ~ Hack20
PerlとJavaScriptとAndroidとiOSとのんのんバアとオレ
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
LITメンター研修_Android0212
【LiT Leaders】Android0309
An other world awaits you
Tokyo GTUG Bootcamp2010
2008.10.18 L4u Tech Talk
歌舞伎座Tech Rx会
ICT ERA + ABC 2012 Tohoku
学生向けAndroid勉強会(入門編)
Android T2 on cloud
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
Ll xcode
C#次世代非同期処理概観 - Task vs Reactive Extensions
Ad

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