ScalaでAndroidアプリな修行をはじめています
Posted: Updated:
Android!
自称フロントエンドエンジニアということで、普段はHTML/CSS/JavaScriptが守備範囲ですが、Android/iOSでネイティブアプリも作ることができたら、クライアントサイド実装の幅を拡げられるな〜、ということでレッツトライ。
前回Railsで俺専用RSSリーダーを用意したので、それのControllerに.json
のレスポンスを追加してAPIらしくしました。
それを取得してAndroidでリスト表示+選択した記事のWebView表示くらいまでを目標に挑戦中。
今の時点でも、リスト表示とカテゴリー切り替え、WebViewでの記事表示までは出来てます(∩´∀`)∩ ワーイ
解説記事を見ながら環境構築
前提としてScala + IntelliJ IDEAでAndroidしたかったので、 ちょうど同じ条件で手順を解説されている[Mac] Android アプリを Scala + Intellij で開発したい件 | ゆーすけぶろぐ を参考に進めました。
Android SDKとPATH
Android SDK本体は以前からemulatorやらddmsの利用のため入れていたのでインストール済み。その上で.zshrc
にAndroid SDK周りのPATHを下記のように通しています。
export ANDROID_SDK=/Applications/android-sdk-macosx export ANDROID_SDK_HOME=/Applications/android-sdk-macosx export PATH=$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools:$PATH
IntelliJ IDEAにSDKの類を登録
IntelliJ IDEAに、 Structure > Platform Settings > SDKs でJDKとAndroid SDKを登録しました。JDKが入っていない場合は、ググったらMac向けのJava SE 6のインストールを参考に。7は試してないです。
JDK 1.6 : /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Android 4.0.3 Platform (API Level 15) : /Applications/android-sdk-macosx
Scala
Scalaは、ScalaでPlayなアプリをHerokuにデプロイした作業ログ ::ハブろぐでインストール済み。自分はyuroyoro/svmを利用しています。もちろん、homebrewなどで入れても良いと思います。
あ、はじめpocorall/scaloidを使おうとして、それがScalaのバージョンを2.10.0以上で要求していたので、アップデートして今2.10.1を利用しています。scaloid自体は結局、余計混乱しそうだったので今回は使わないことにしました。
android-plugin
ScalaでAndroid開発するためのsbtプラグイン(sbt = Scalaのビルドツール)を導入します。初期化やビルド、実機転送などもこれで行うことになります。
Getting started · jberkel/android-plugin Wikiを参考に進めます。
テンプレートからプロジェクトを作成 giter8というScalaテンプレート生成コマンドを、conscriptというscalaベーススクリプトのインストールコマンドを使って導入します。(ややこしい)
どちらもgithubのリポジトリをベースとしているみたいです。ナウいですね。
% curl https://raw.github.com/n8han/conscript/master/setup.sh | sh % ~/bin/cs n8han/giter8 % ~/bin/g8 jberkel/android-app Template for Android apps in Scala package [my.android.project]: mu.aho.Testroid name [My Android Project]: Testroid main_activity [MainActivity]: scala_version [2.9.2]: 2.10.1 api_level [10]: 15 useProguard [true]: scalatest_version [1.8]: Template applied in ./testroid
sbt-idea
プラグインを入れるとIDEAの設定ファイルを作れるようになったりします。ユーザーディレクトリの.sbt/plugins/build.sbt
に下記の内容を書いておけばOK。
% mkdir ~/.sbt/plugins % emacs ~/.sbt/plugins/build.sbt addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.2.0")
実際にIDEAの設定を作って、デバイスに転送してHello Worldするにはsbt 'gen-idea no-classifiers' compile
して実機かエミュレーターにインストールします。
% cd ./testroid % sbt 'gen-idea no-classifiers' compile % sbt > android:package-debug (…何か色々でる) > android:list-devices List of devices attached NANANNANA device > android:install-device
なんかいろいろ
Androidならでは的な。最早メモ書きです。
HTTP
基本のHTTP通信から。
NetworkOnMainThreadException
メインスレッドで直接ネットワーク処理を行うとandroid.os.NetworkOnMainThreadException
が発生して落ちます。UIスレッドをブロックすんな的な?フロントもブラウザ気にせずWebWorker使えるとよかですな。。
AsyncTaskLoader
で、AsyncTaskLoaderで別のThreadにさばいてCallbackを受け取ればOKということで。
- AsyncTaskLoaderを4ヶ月常用してみて - ナカザンドットネット
- 1画面で複数AsyncTaskLoader : sms日記
- AsyncTaskLoaderのあるActivityに戻ってきたときに再度loadInBackgroundが呼ばれる問題 - digital matter
Fragment
Fragmentという仕組みを使うと良いそうです。ListFragmentを継承してLoaderCallbacksを実装したりとか。
android-support-v4.jar
APIレベルを15に上げる前に、Compatibility Packageを試していたのですが、その際はlib
ディレクトリに.jarを突っ込めばOKでした。
Play2.0(Scala)で依存するjarを追加する | mwSoft
ということで
現在のフロントエンドを深く掘るためのナレッジも大切ですが、今後継続的にクライアントサイドの表現の幅を拡げるには、同時に新しい領域に移り続けられる地力を鍛えるですね、ってことでちょっとチャレンジしてている最中な次第。
JavaもAndroidのAPIも分かってるわけじゃないのに、いきなりScalaを選んだおかげで、Androidの扱いと世間のJavaサンプルコードをScalaで表現することの両面で苦しんでおります。まあ、慣れたらわりと何とかなってきましたが。。。(´ω`)
http://read.aho.muを見るだけのアプリですが、勢いでPlay Storeに公開するところまではいってみようと思います。