Androidの非同期通信処理

Android書いてますか?

これなに

2013年10月13日あたりに流行ってそうな,Android非同期通信処理方法のススメを,Android非同期通信何それ?な人に向けて簡単に情報をまとめる
Android普段全く書いてないけどここ数日少し調べた自分が知識の共有のために残す
また将来的には流行りは変わるので今しか使えない

転用ばかりで申し訳ない感じなので日常的にAndroid開発してる方はお帰りください
最低限動かすための,すぐに動かすための情報しか書いてないので良くない情報もある

Androidでの非同期通信処理

サーバとの通信を行う際に記述しなければならない処理.Androidではメインスレッド上で通信を行う事が出来ないため,サーバとの通信を行うには非同期スレッドを立てなければならない.

昔の処理

Android2.x時代はメインスレッドに直接処理を書けたらしい
非同期処理にしなければならくなった際に出たのがAsncTask

もうAsyncTaskを使う理由は全く無くなったと言っても過言では無い

今の処理

AsyncTaskLoadervolleyの2つの方法が主流だろう.どちらも良い感じ.

これら2つについて,軽くポイントを抑えると以下な感じ

  • AsyncTaskLoader
    • Android3.0以上で使える機能
    • support library*1を使えばもちろん2.xでも使える
    • メインの通信処理はAsyncTaskLoaderを継承した独自クラスの中で行わせる必要があるため,自分で書くかまた別の実装が必要になる
    • CallBackは呼び出す側でLoaderCallbacksを実装する事で良い感じに定義可能
  • volley
    • Goggleが目下開発中のネットワーク周りライブラリ
    • 基本的な通信処理はRequestとして予め用意されているので,詳しく書きたければこれを継承させて用いる
    • 簡単な処理を行う際には,非同期処理を行うための別クラスを作成する必要が無い
    • 画像キャッシュ良い感じだし,リクエストを複数投げるのに向いてる

どうすればすぐに使えるか,軽く順に紹介する.
と思ったけど良い記事たくさんあるから,リンク張りながらコメントする.

AsyncTaskLoader

1年以上前の記事といった表示がされているが,AsyncTaskLoaderを使ってみる | Developers.IOはそのまま使えるコードが置いてあるし,AsyncTaskLoaderの動作イメージは参考になる.
こちらにあるHttpUtil.getBitmapHttpService(context, url)といった処理が実際の通信処理になるため,適宜別の実装が必要である.基本的にはorg.apache.httpを使えば書ける.
Android2.xで使う場合にはsupport.v4に含まれているものを使う.
具体的には,以下な感じでsupportの方を使うのが良いだろう.もちろんLoaderCallbacksにもsupportライブラリに含まれているものを使う必要がある.

// 3.0以上でしか使えない
import android.content.AsyncTaskLoader;
// support.v4を使っているため2.xでも使える
import android.support.v4.content.AsyncTaskLoader;

最低限の要点だけ抑えてしまうと,以下の2つのクラスの実装が必要だ

  • AsyncTaskLoaderの継承クラス
    • 通信処理の返り値の型を明示する
    • コンストラクタで初期化する
    • loadInBackgroundをoverrideして通信処理を書く
  • LoaderCallbacksの実装クラス
    • 新しく非同期処理のLoaderを作成した時に行うProgressBarを表示するなどの処理をonCreateLoaderをoverrideして書く
    • Loaderの終了時にはonLoadFinishedが呼ばれるため,こちらには例えば取得した画像を描画する,ProgressBarを閉じるといた処理を書く

これ以外にもoverride出来る関数はあるので,必要に応じてAsyncTaskLoader | Android DevelopersLoaderManager.LoaderCallbacks | Android Developersを参考にすれば良いだろう.

volley

今使ってる.何をしてて,何が出来るんだ,といった解説記事はネットワーク通信用ライブラリVolleyを使いこなす | Tech Boosterが非常に参考になる.

volleyを使う最低限の要点は以下のような感じになる

  • 呼び出しを行うクラス
    • 通信処理(Request)を貯めこむRequestQueueを用意する
    • Requestのインスタンスを用意してqueueに追加することで通信が行われる
    • インスタンス生成時に,通信成功時,失敗時のCallBackを引数に与える
  • Request
    • 用意された色々なRequestを使っても良いし,良い感じに拡張するのも良い*2

良い感じに拡張するってなんだろう,みたいな感じだが,例として皆大好きjsonをgoogle-gson*3を使って特定のクラスにマッピングしたものを返すリクエストを作ると,このような感じ*4になる.先のリンクには使用例も書いた.RequestQueueという名前がどんどんRequestを投げ込んでくれ!といった思考植え付けられる感じで良い.

volleyを使うには...?

Android アプリ用ライブラリ Volley を準備する - ひだまりソケットは壊れないに書いてある.

library moduleとして取り込むのも良いが,てっとり早いのはjarって使うプロジェクトのlibsに入れる事だろう*5
その場合には以下の3つのステップを踏めば良い

  1. git clone https://android.googlesource.com/platform/frameworks/volley
  2. eclipse等でcloneしたプロジェクトを開き,Export->java->jarでvolleyのsrcのみチェックして,書き出すjarを指定してok
  3. 使う側のlibsに出来たjarを入れる

正直な所volley目下開発中だし,プロジェクトをlibraryとして取り込む方が良いし,上の方法おすすめしない.

ほげほげ〜

色んな記事がある.また増やしてしまったの世間的一般に申し訳ない.

後もう1つ気になるものがあって,AndroidAnnotationsで@backgroundとかくと非同期処理になるっぽいし,すごそう.でもブラックボックス過ぎて正直怖すぎる.

*1:3.0以上の機能を2.xなどでも使えるようにするライブラリ

*2:書き方最悪っぽい

*3:いずれ使いたくなる便利ライブラリ

*4:参考: https://gist.github.com/ficusk/5474673

*5:ただし内容が固定されてしまうのであまり良くない

第2回ミーティング

f:id:appspring:20131012105406j:plain

進む!!AppFountain!!

こんにちは、UOです。 僕は情報学の中でも最も情報学らしくないと いっても過言ではないところにいるわけで*1、 とにかく、がんばるしかないわけで。

krrrrさん、レテさんのご指導のもと、 UOAndroidと格闘しています*2

今回のミーティングは、
- 見た目をどうするか(遷移先をどうするか)
- どういう機能をどこに配置するか
ということを話し合っていました(たぶん)。

ということで、引き続き頑張っていきます!*3

担当:UO

*1:北の国からを改めて見てみたいわけで

*2:どんなに良い教師でもやっぱ生徒があれでは、ね

*3:みんな忙しいので、なかなか日程が合わないのですが‥

MacでAndroid開発環境を手早く整える

こんにちは! レテです.

SADPに当たって,MacにAndroid開発環境を整えたので,自分がどんなことをやっていたかを備忘録的にまとめておきます.

Androidも更新ペースが激しいのか,意外とまとまった形で最近のAndroid環境のインストール方法を書いているWebページは多くありませんでした.

少しでも役に立てばいいな(願望)

やりたいこと

MacにEclipseAndroid SDKとAVDを導入して,PCのみでAndroid開発ができるようにしたい.

対象者

Android/Java初学者. CLI使えない人にも少し配慮したい.

あまり細かいことは気にせず,とりあえず動けばいい人向け.*1

ちなみに僕も初学者です(しろめ

環境

Mac OS X 10.8.5

Javaの処理系を導入

Android SDK導入前に,Javaのインストールが必要.

僕の環境ではJavaはデフォルトではインストールされてなかった.

初心者必見!MacでAndroidアプリの開発環境を整えよう【SDKインストール】 | GanoWeb

辺りを参考にインストール.

今回インストールしたバージョンは1.7.0_25.*2

Android SDKの導入

Android SDKとは,Android開発のための開発キットのようなもの.

最近はJava用のIDE(統合開発環境)であるEclipseとまとめて配布されているらしいのでそちらを使う.

Android SDK | Android Developers

f:id:appspring:20131007105851p:plain

赤枠のボタンを押してライセンス云々にagreeするとZIPファイルがダウンロードされる.

今回ダウンロードしたのはadt-bundle-mac-x86_64-20130917.zip.

解凍したディレクトリを"アプリケーション"ディレクトリ直下に入れ,その中の"eclipse"ディレクトリから"Eclipse.app"を開く.

f:id:appspring:20131007111226p:plain

f:id:appspring:20131007111349p:plain

Eclipseの設定

各種ツールの導入

Eclipseを起動するとworkspaceが云々言われるけど,OKしとけばおk.

確か,初回起動だとWelcome画面が出てくる気がしたけど,それも☓ボタンで消せばおk.

大事なのはここから.

EclipseAndroid関係のツールを導入する必要があるらしい.

Developer Toolsの導入

メニューバーの"Help"から,"Install New Software..."を選択.

f:id:appspring:20131007112449p:plain

出てきた"Install"ウィンドウから"Work with:"->"Add..."を選択.

f:id:appspring:20131007112600p:plain

"Add repository"ウィンドウの"Name"に"android","Location"に"https://dl-ssl.google.com/android/eclipse/" と,それぞれ入力してOK.

f:id:appspring:20131007112902p:plain

"Install"にいろいろ追加されるので"Developer Tools"にチェックを付けて"Next >"を押す.

f:id:appspring:20131007113451p:plain

その後はNextとかOK連打で行けたような気がする.*3

最終的に自動で再起動されたように思う.

Android Support RepositoryとAndroid Support Libraryの導入

Android 3.0以上の機能を2.xで使うためのsupport v4, v7といったライブラリを利用するために必要になる.*4

下矢印のついたドロイド君アイコンをクリックして,"Android SDK Manager"を開く.

f:id:appspring:20131007114927p:plain

"Android SDK Manager"ウィンドウが開く.

いろいろ書いてあるけど,"Extras"ディレクトリの"Android Support Repository"と,"Android Support Library"のStatusが"Not installed"かどうかをチェック(下の写真は"Installed"なので問題ない).

f:id:appspring:20131007115245p:plain

"Not Installed"のものがあれば,それにチェックを入れて,"Install packages..."を選択.

インストールが始まる.

Android SDKのパス設定

Android SDKEclipse上で動かすためには,EclipseAndroid SDKの居場所を教える必要がある. これがパス設定.

メニューバーの"ADT"->"環境設定"を選択.

f:id:appspring:20131007120259p:plain

"Preferences"ウィンドウが開くので,"Android"を選択する("Android"の下の階層にもメニューがあるが,今回はルートのメニュー).

"SDK Location"->"Browse"を選択.

f:id:appspring:20131007120746p:plain

出てきたウィンドウの中からSDKのディレクトリを探す.

今回は,"アプリケーション"ディレクトリ内の,"adt-bundle-mac-x86_64-20130917"->"sdk"がSDKのディレクトリとなる(要するに"/Applications/adt-bundle-mac-x86_64-20130917/sdk").

これを選んだ上で,"Apply"を押してOK.

文字コードの設定

文字コードUTF-8にしておくと,多人数開発環境では無難.

先ほどと同じ手順で"Preferences"ウィンドウを開き,"General"->"Editors"->"Text Editors"->"Spelling"を選択.

そして,"Dictionaries"->"Encoding"について,"Other"にチェックを入れ,プルダウンメニューから"UTF-8"を選択.

f:id:appspring:20131007121922p:plain

これで,Eclipseテキストエディタ文字コードUTF-8になった.

AVD(エミュレータ)の設定

Android Virtual Device(AVD)は,Android実機をPC上で再現したもの(エミュレータ).

Androidでは,実機をUSBケーブルで接続し,そのマシンにアプリをインストールしてデバッグする方法と,AVDにアプリをインストールしてデバッグする方法がある.

AVDを使うことで,実機を持っていなくてもAndroidデバッグが出来る(ただし,一部の機能が使えない,動作が非常に重いなどの制約がある).

実機しか使わない場合は必須ではないが,これも設定しておこう.

ツールバーから,スマホの中にドロイド君がいるアイコンを選択.

f:id:appspring:20131007165211p:plain

"Android Virtual Device Manager"ウィンドウが出てくるので,"New..."を選択.

f:id:appspring:20131007165415p:plain

"Create new Android Virtual Device (AVD)"ウィンドウが出てくるので,"AVD Name"にエミュレータの名前を(適当でよい.ここでは"android4_3とした),"Device"に再現するデバイスの種類を(適当でよい.ここでは"Nexus 4"を選択した),"Target"にAVDのAndroidのバージョン(ここでは,"Google APIs (Google Inc.) - API level 18"を選択した)を入力し,OKを押す.

f:id:appspring:20131007170021p:plain

下図のようにエミュレータが作成された.

f:id:appspring:20131007170211p:plain

サンプルソースを動かしてみる

準備は整ったはずなので動かしてみる.

メニューバーの"File"->"New"->"Android Application Project"を選択.

f:id:appspring:20131007124847p:plain

開いた"New Android Application"ウィンドウで,"Application Name", "Project Name", "Package Name"を入力.

他は好きなものでいいとして,"Package Name"については,取得ドメインを逆順にしたものを使うべきとされている(Ex. ドメインが"hoge.com"なら,"com.hoge").

今回は,"Application Name", "Project Name"ともに,"SampleProject","Package Name"は"com.example.sampleproject"とした.

f:id:appspring:20131007125628p:plain

あとは,NextなりFinishなり連打していけばいいと思う.

これで,Androidプロジェクトが出来た.

では,このプロジェクトを実際に動かしてみよう.

ツールバー中の右矢印のアイコンをクリックすると,初回のみ,"Run As"ウィンドウが出てくる.

ここで,"Android Application"を選択してOKを押す.

f:id:appspring:20131007132352p:plain

すると,Androidエミュレータが起動する.

f:id:appspring:20131007124847p:plain

かなり待たされるが,Androidのロック画面が出てくれば,起動は成功.*5

ロック画面は,カギのアイコンをドラッグ(実機のスワイプに相当)することで解除できる.

ホーム画面からは,アプリ一覧を開いて動作させたいアプリを探す(今回は"SampleProject").

f:id:appspring:20131007132019p:plain

f:id:appspring:20131007132037p:plain

この画面が出てくればOK!

f:id:appspring:20131007132100p:plain

まとめ

元のドキュメントをまとめてもらったkrrrrさんに感謝.

iOS開発に比べると, Androidは開発環境に必要な手順が多い気がしました.

Java周りの知識があるとだいぶ楽な気がします(開発そのものも含めて).

全然サーベイと検証が足りてないので,指摘/加筆してもらえると助かります…

*1:基本的にSADP参加者向けです

*2:Java 1.7はAndroid SDKに対応してないという話を聞いたけど本当なのかな

*3:いろいろあったと思うけど検証できないので誰か指摘してもらえると助かる…

*4:ここらへんはkrrrrさんに言われるがままにやった(正直)

*5:初回だとチュートリアルみたいなのが出てくるかもしれない.全部OKで.

今しかgit使わない人向けの共同開発サイクル with Eclipse EGit

コレは何

gitをあまりにも知らない人に対し,EclipseのPluginであるEGitを用いて共同開発する際の作業サイクルを画像を用いて書いたもの
GUIでgit操作を行い,他の共同開発者が困らない程度に最低限すべき事を書いたもの.

BadKnowHowあります.極力使わないで下さい.*1

GitやEclipse,Egitに関しての知識が欲しくて来た方,お帰り下さい.

書いた人はEGitの知識皆無.

対象

  • 1人目のメインとなる対象は,gitって何?という状況において,一応ではあるが書いたコードを上手く共有させたいと考えている人向け
  • もう1人の対象は,限られた時間の中で,エンジニアチックでない人に少しでもエンジニアっぽい事を体験して欲しいと思ってる人向け.

想定環境

開発サイクル

gitを知らない人は以下のようなサイクルを取ると良いでしょう.
なお,このサイクルは例えば数カ所の変更作業を開始してから終了するという一連の流れを示しています.
作業をする際はこのサイクルを1から毎度行って下さい.

ちなみに最々低限これだけは覚えて下さい

  • 作業開始時にpull,作業終了時にpush.
  • 作業中はaddとcommitを繰り返す.

以下サイクル

  1. 作業開始
  2. pullする(他の人の変更を自分のローカルファイルに対して更新させます.これで作業開始時は常に最新版になります)
    • プロジェクトを右クリックしてpullします
    • f:id:appspring:20131005183425p:plain
    • f:id:appspring:20131005183428p:plain
  3. ファイルを編集する
  4. ファイルをAddする(自分が変更したファイルをgitさんに教えてあげます.複数のファイルを逐一まとめてAddしても良いです.)
    • ファイルを右クリックしてaddします
    • f:id:appspring:20131005183430p:plain
    • f:id:appspring:20131005183433p:plain
  5. commitする(Addしたファイルに対して,1まとまりの自分の変更を記録します)
    • f:id:appspring:20131005183447p:plain
  6. commit文を書く(どんな変更に対するcommitなのか分かる用に書いてください)*3
    • f:id:appspring:20131005183451p:plain
  7. OK押す事でcommitされる
  8. pushする(pushする事で,他の共同開発者にも自分の変更を共有させる事が出来ます)
    • f:id:appspring:20131005183530p:plain
  9. ログインが必要ならばgithubアカウントでログインする(初回のみ?)
    • f:id:appspring:20131005183535p:plain
  10. 確認する(github上のcommitに対し自分の変更が表示されていたなら,共有完了です)
    • f:id:appspring:20131005183545j:plain
  11. 作業終了

1に戻る

Egitにはcommit and pushとかいう機能もあるんで,7, 8の過程をこちらをクリックする事で1つにまとめても良いです.*4f:id:appspring:20131005185105j:plain

ちなみに

commitは大きくなると面倒です.取り敢えずcommitしまくって大丈夫です.

こっからは理解しなくても良いです.
本来はcommitは変更箇所毎にまとめてするもの.pushするタイミングも適度なcommit数になったひとまとまりでするもの.
さらに本来は,中程度の変更毎にbranchを切って作業するもの.
変更のまとまりについては,感覚的なものもあります.
ちなみに自分はこんな感じ

gitについて

もし興味を持ったならば,以下のような資料が参考になるでしょう
サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ
サルでも分かるんで,分からなければサルっぽい未満です.
後は分からない事,知りたい事があれば周りの知っている人に積極的に聞いて下さい.本気で知りたい人に対してはエンジニア勢はWelcomeで頑張って教えたくなります.

gitを知ってる人

ちゃんと教えましょう ,はい.

はい.

*1:全て読んだ上でのなんだこれとかいうツッコミ,ありがとうございます

*2:▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわああああああぁ

*3:この時点では変更を知っているのは自分だけ

*4:もはやsubversionと等価

第1回ミーティング

AppFountain始動しました!

初めまして!チーム名AppFountainです!

本日第1回ミーティングを済ませ,チームとして始動しました.
AppFountainはリーダーのレテ君,UO君,そして私krrrrの3名で構成されています.*1

SADP2年目として,社会情報学専攻の修士1年がチームを組み,1つの共通の目標を達成しようというものです.

本年度のSADPではチーム内での情報も気の向くままに共有していきたいと思っています.

本日のミーティングでは以下のような事を決定しました.

  • チーム名
    • AppFountain
    • アプリの泉という名前を用いました
  • 諸連絡ツール
    • LINEグループ
    • 日常的に活用しているものをそのまま用いるのが良いかと
  • ファイルの共有
  • ソースコード管理
    • github
    • 最高のサービスです!
  • Version管理
    • git
    • 最高のツールです!
  • サーバ
    • 開発時は個人サーバを利用
    • 後々は変更するかもしれません
  • アプリ名
    • AppFountain
    • チーム名の元となったものです.
    • 最高のアプリになる予定です!
  • 対応OS

我々が作るアプリのコンセプトは一先ずではありますが,『アプリ情報の知恵袋』,となっています.

どのようなアプリになるかは,次第に明らかになっていきますが,間違いなく最高のアプリになることでしょう.
リリースが待ち遠しいですね!

AppFountainの情報はこちらのブログで更新していく予定です.

今後とも,よろしくお願いします.

担当: krrrr

*1:ネット上での名前の表記をまだ決めていませんでした←決めました! 10/05追記