Contenu connexe
Similaire à Androidの通信周りのコーディングについて
Similaire à Androidの通信周りのコーディングについて (20)
Androidの通信周りのコーディングについて
- 2. 私です
名前 : 高木翔一
会社 : 株式会社ディディアイディ
Twitter : @fly1ncu
blog : http://blog.fly1ncu.com
スライドはアップロードするのであとでゆっくりみてね
- 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クラスが準備されている
要素が増えてくるとめんどくさい (´Д`)
- 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
- 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);
}
- 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がリセットされた時によびだされる
}
}
- 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();
}
}
}
}