Archive | 5月 2013

Android Studio

Google I/OでAndroid用統合環境が発表されました。

Early Access Preview版ということで、まだ正規版じゃありませんけど、流れに乗ってインストールしてみました。

downloadはこちら→Getting Started with Android Studio – Android Developers

 

いままでのEclipseベースではなく、IntelliJ IDEAベースでだいぶ見た目も変わってます。SDKも含めて、なんもかんもいっぺんに入っちゃう印象なので、今までのようにSDKいれてからプラグイン入れて…みたいな手順がなくなって便利。

環境によって、説明が変わってくるのとか、本当に面倒なのでこういう統一された環境があるのはありがたいことで。導入のハードルも下がって、いままで悩んでた人もAndroidStudioが出たらやってみてもいいんじゃないでしょうか。

android_studio_design

UIデザインの画面ですが、最近のADTプラグインでも充実してきてるものになってきてますが、それと同じような感じかそれ以上にわかりやすいものになってるみたいです。というくらい、まだ、ちょっとしか触ってないんですけど。

既存のEclipseのプロジェクトを取り込むのは、なんか方法があるんでしょうけど、ソースとlayoutのxmlをエディタ上でコピーしちゃえばいいかとか思ってるところです。その辺りは、また手を付けたらまとめよう。

 

外部ライブラリなんかは、プロジェクトツリーから追加じゃないので、いろいろ調べちゃいましたが

android – How to add external library in IntelliJ- – Stack Overflow

に載ってた手順が参考になりました。

  • Project Settingを開く(CTRL+ALT+SHIFT+S)
  • Project Settingの下にあるLibrariesを選択
  • 右のリスト(ウィンドウが3つに分かれてるので、その真ん中)の+からJavaを選ぶ
  • jarファイルをいれたフォルダ(/libsとか)を選んで追加
  • どのモジュールに追加するか選択

でいいみたい。コピーしなくてもフォルダやファイルを選択して取り込めるので、その辺りは従来通りかと。

 

インストールの手間が本当になくなったなーっていう印象ですね。

FragmentでAsyncTaskLoaderを使ってみる

ネットワーク経由でJSONファイルを取得する実装をしてたんですが、ネットワークアクセスのpermissionも設定しているのになぜか例外投げられてうまく動かなかったんですが、そういえばHoneyComb以降では、ネットワークアクセスをする場合、UIスレッド以外からという制約ができていて、それを回避するためにはAsyncTaskを使わないとダメですよという話を前に聞いたなーと思ったんで、AsyncTaskでネットワークアクセス部分を実装してみました。

しかし、受け取った内容をDBにいれてListViewにセットしたAdapterの更新どうすんだろうとしばらく悩んでたところ、AsyncTaskLoader使うと処理終わったときにUIスレッド側のcallbackメソッド呼べますよっていう話なんで、その方が楽そうなのでそっち使ってみることにしました。

まずは、いままで使っていたクラスの変更を。

extends AsyncTask<?,?,?>

になっているところを

extends AsyncTaskLoader<?>

に書き換え。

loadInBackgroundの引数は必要なくなるので削除。onStartLoadingが必要になるので追加。

loadInBackgroundで使っていた引数は、コンストラクタに引数で渡してメンバー変数に変更。

Fragment側にimplements LoaderCallbacks<?>を追加すれば、Eclipseの補完機能(unimplemented methodsとかいうアレ)で必要なメソッドのひな形が追加されるので、そこに今まであった処理(onLoadFinished)を移動。

onCreateLoaderには、AsyncTaskLoader用クラスのコンストラクタの呼び出しを書いて終わり。

 

このLoaderを呼び出す場合は、getSupportLoaderManagerを使うのでFragmentActivityを使うという説明を読んだけど、FragmentActivity使ってないし、Fragmentにはそんなメソッドがないのでダメなのかと思っていたら、getLoaderManagerというメソッドがあったので気にせずこちらを使ってみたら問題なく動いている。あとでメソッドの説明文読んだら、いっしょの文章だったから、気にしないことにした。

 

getSupportLoaderManagerもgetLoaderManagerも。・・LoaderManagerを取ってくるメソッドだから当たり前かもしれないけど、どちらもinitLoaderが使えるので、

getLoaderManager().initLoader(int, Bundle, LoaderCallbacks<?>)

で呼び出せば、別スレッドで処理が走る。

 

処理が終わったらcallbackでonLoadFinishedが呼び出される。

受け取ったデータをDBにいれたら、CursorLoader.loadInBackgroundを呼び出して、mAdapter.swapCursorでCursorを更新すれば、ListViewも更新される、と。

 

これで動いているので、この件は一応の決着。

%d人のブロガーが「いいね」をつけました。