ListActivityを継承したActivityクラスで、AsyncTaskで重い処理を行った後リストを更新するには

Androidアプリ開発において、時間のかかる処理を行うのにAsyncTaskを利用することがありますが、ListActivityで、リストの項目の削除、全削除をAsyncTaskで行い、削除後リストを更新するには一工夫が必要です。何も考えない場合、UIスレッドで、AsyncTask#executeの後、リスト更新を行ってしまいがちですが、AsyncTaskは非同期処理のため、executeを呼んだ直後にリスト更新が行われ、思うような動作になりません。

AsyncTaskでは、時間のかかる処理を終了後、onPostExecuteメソッドで終了処理を行います。このメソッド内で、リスト更新を行えばいいのですが、リスト更新処理内で、ArrayAdapterを継承したクラスのコンストラクタを呼んだり、ListActivity#setListActivity、ListView#setOnItemLongClickListenerを呼ぶには、AsyncTaskを継承したクラスに、Context、ListActivity、OnItemLongClickListener型のメンバ変数が渡されないといけません。そこで次のように実装をします。

AsyncTaskを継承したクラスHogeAsyncTaskで、コンストラクタを

public HogeAsyncTask(Context context, ListActivity listActivity,
      OnItemLongClickListener onIetmLongClickListener) {
    mContext = context;
    mListActivity = listActivity;
    mOnItemLongClickListener = onIetmLongClickListener;
    helper = new CreateProductHelper(mContext);
    dataDao = new DataDao(helper);
}

と定義して、ListActivityクラスを継承して、OnItemLongClickListenerインターフェースを実装したクラスFooAcitvityでは、

new HogeAsyncTask(FooActivity.this, FooActivity.this, FooActivity.this).execute();

で、AsyncTaskの処理を呼びます。そして、リスト更新は、AsyncTaskを継承したクラスのonPostExecute内で、

dataList = dataDao.select();
if (dataList != null) {
    mAdapter = new CustomAdapter(mContext, dataList);
    mListActivity.setListAdapter(mAdapter);
    ListView lv = mListActivity.getListView();
    lv.setOnItemLongClickListener(mOnItemLongClickListener);
}

で行います。なお、ここで書いたコードは断片コードですが、CreateProductHelperはSQLiteOpenHelperを継承したクラス、CustomAdapterはArrayAdapterを継承したクラスです。

Aug 21, 2012 追記
内容を修正したものを、「ListActivityを継承したActivityクラスで、AsyncTaskで重い処理を行った後リストを更新するには(改版)」に書きました。

Titanium Mobileで開発するiPhone/Androidアプリを読んで

北尾雅人著「Titanium Mobileで開発するiPhone/Androidアプリ」を週末に読んできて、今日、読み終わりました。写経しつつ読むことをやりましたが、週末の一日丸一日をかけて、約12日間で読み終わりました。

本を読んでの感想です。

  1. おきまりのHello Worldから始めますが、そのあと、簡単なTwitterクライアントを作って、スクリプトファイルの分割、共通ソースのオブジェクト化、国際化などが出てきます。
  2. 実践的なサンプルアプリは、ユーザ認証やツイート機能、カメラで撮影した画像付きのツイート機能があるTwitterクライアントTinyTweet、食べログAPI、GPS、データベースを使ったアプリTabeNaviで、大変勉強になりました。
  3. ただし、サポートサイトで公開されているサンプルソースが完成版で、途中経過のソースコードがなく、写経、デバッグに苦労しました。本のソースコードでは省略が多かったり、本の先を読んだり、サンプルソース全体を読んでコードを入力しないとアプリが動作しないことがありました。章、節ごとに途中のサンプルソースを公開してよと言いたいです。特に、実行時にレイアウトがおかしなることがあり、コード入力ミスなのかと疑い、時間を食いました。結局、これはTitanuim SDKのバージョンに依存した現象で、レイアウトでwidthを画面幅に設定するなどして解決しました。
  4. データベース操作では、生のsql文を実行していて、Androidに比べ、データベース機能はいまいちだなと思いました。
  5. iOSがターゲットの場合、xib2jsというアプリを使うと、XcodeのInterface Builderで作ったxibファイルからxib2jsでjsファイルを得られると本の付録には書かれていますが、Xcode 4.3ではxibファイルがないようで、それができませんでした。
  6. 付録のモジュールを使う内容は、AdMobの場合ですが、ti.admobフォルダーのコピー先がよく分からず、検証はできませんでした。ただし、AdMobなどの広告をアプリに導入する際は、モジュールが必要かと思いますので、ググる必要があります。
  7. Androidではバックグラウンドで処理を実行するServiceがありますが、それがTitanuim Mobileで利用できるかは、サンプルや簡易リファレンスで出てこなかったので、分かりません。
  8. この本は、API簡易リファレンスがついているので、開発の時は役立ちそうです。

この本ではなく、Titanium MobileでAndroidやiOSアプリを開発することに関しての感想です。

  1. JavaScriptで開発するのは、それが動的言語であるため、コーディングのとき、コードアシストが貧弱で、変数やメソッド、その引数のサジェストがあまりなかったり、全くなかったりして、コーディングミスすると、アプリ実行時でないと分からないです。
  2. アプリの動作がTitanium SDKのバージョンに依存するところがあります。
  3. GUIと処理との分離がされていないため、アプリ実行時でないと、アプリのレイアウトがわからないという欠点があります。
  4. Web APIを利用する場合、取得データがJSONのときは、JavaScriptとの相性がいいため、開発しやすさはあります。
  5. Titanuium Mobileで開発するとき、ターゲットがAndroidの場合、GUIの見かけが貧弱です。本の付録には、JSSを使ったレイアウトの記述がありますが、Androidの場合、それで改善されるかわかりません。

したがって、全体的に考えると、JavaやObjective-Cで開発するのに比べ、開発が楽とは言いがたいです。ただし、同じコードで、AndroidとiOS両方に対応したいときはTitanium Mobileで開発するのもいいかもしれません。

iOSプログラミング入門 – Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎読了、感想

大津真著iOSプログラミング入門 – Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎を読み終わりました。この本を読む前に、森巧尚著よくわかるiPhoneアプリ開発の教科書 iOS 5 & Xcode 4.2 対応版を読んでいたのですが、オブジェクト指向やメモリー管理についての説明が不十分で、複雑なアプリの開発には知識が不十分だと感じて、大津真氏の本を購入して、読みました。

感想です。

  1. オブジェクト指向について、基本的なことから説明してあります。プロパティ、アクセサメソッド、メソッドの説明をちゃんとしています。@propertyによるアクセサメソッドの宣言、@synthesizeによるアクセサメソッドの生成の説明もしっかりやっています。森巧尚氏の本ではその辺をちゃんと説明していなく、よくわからなかったのが解消されました。また、独自クラスの作り方や、Javaのインターフェースに相当するプロトコルの説明や、実装方法の説明もありました。森巧尚氏の本でよく分からなかったフレームワークのメソッドのシンタックスおよび使用例も説明してあり、こうやって使えばいいんだと理解できます。
  2. @property宣言する際の、値の属性、assign、retain、copyの説明もされています。
  3. ただし、メモリ管理の説明は少なかった。特に、iOS5から導入されたARCについては説明がなかった(というか、この本執筆時に、未導入?)ので、最新のXcodeでプロジェクトを新規作成して、コーディングするときは、本の通りにやると警告が表示されることがあった。
  4. iOSアプリ開発の基礎的な事柄は、大津真氏の本と森巧尚氏の本で得ることができると思います。
  5. 欠点としては、本の内容構成で、ソースコードを写経しずらいことです。写経は途中で諦めて、ダウンロードしたサンプルコードをインポートして、読むにとどめました。

ARCを説明している初学者向けの本はあまりないようで、ググったら、iOS 5 公開記念! Objective-Cのメモリ管理の革命、 ARC 超入門(サンプルはgitHubに公開) を見つけたので、勉強してみることにします。

Titanium Mobileアプリ開発での国際化の際の注意

Titanium Mobileで開発するiPhone/Androidアプリ 北尾雅人著を読んでいますが、アプリの国際化のところでハマりました。strings.xmlファイルを作り、jsファイルで、国際化する文字列を、L(‘keyword’)で置き換えたのですが、アプリを実行すると、国際化した文字列がなくなり、表示されませんでした。プロジェクトを一旦クリーンしてから、再ビルドして、実行すると、文字列が表示され、ちゃんと国際化されました。これはAndroidでの話で、iPhoneではどうかは確認していません。

アプリ開発本を買いました

アプリ開発本を買いました。

  1. iOSプログラミング入門 Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎 大津真著
  2. Titanium Mobileで開発するiPhone/Androidアプリ 北尾雅人著

を買いました。

先日、iOSアプリ開発の本として、よくわかるiPhoneアプリ開発の教科書【iOS 5&Xcode 4.2対応版】森巧尚著を読んだのですが、Objective-Cの説明が少ししかなくて、多分、本格的にアプリを開発するにはダメだろうと思い、1番目の本を買いました。3年くらい前にObjective-CやiPhoneアプリの基礎的な勉強はやったことがあるのですが、多分、あれから仕様が変わっているかと思い、新しい本にしました。この本の「はじめに」で、C言語の知識を想定するとありますが、勉強したことがあり、また、ポインタも理解しているので多分大丈夫でしょう。

また、Titanium Mobileに関しては、Titanium Mobile iPhone/Androidアプリ開発入門 小澤 栄一著をやはり読んだ後なんですが、その本では扱われているサンプルが限られていて、本格的にアプリを開発するには、APIの説明にもページをさいている2番目の本がいいと思い買いました。2番目本は、Amazonで低評価をつけているレビューもありますが、先日、Titanium Mobile iPhone/Androidアプリ開発入門を読んであるので、多分大丈夫でしょう。

よくわかるiPhoneアプリ開発の教科書読了、感想

森巧尚著 よくわかるiPhoneアプリ開発の教科書 iOS 5 & Xcode 4.2 対応版 を、写経しつつ、6日かけて読みました。

Amazonでは、☆印4個の高評価を得ています。確かに、基礎的なことが書かれていて、かつ、わかりやすいです。しかし、作るアプリがほとんどすべてテンプレートを基にして作ったもので、実際にAppStoreに出せるような複雑なアプリを作れるようにはならないでしょう。また、Objective-Cについての説明も、1章しかページをさかれていず、例えば、メソッドの表記の仕方がなぜそのようになるのかとか、noatomicとかretainとかの単語の説明が皆無です。Objective-Cについては、他の本で学習した方がいいでしょう。

Androidアプリを開発するにはどういう本を読めばいいか

Androidアプリを開発し始めて、3年くらいになります。
初心者が、アプリを開発するには、どういった本を読めばいいかを書いていきます。

1. Javaを知らないなら
高橋麻奈著のやさしいJavaを読むといいでしょう。

2. Androidアプリ開発の基本的な本
布留川英一著のAndroidプログラミングバイブル SDK 4/3/2対応
金宏 和實著の作ればわかる!Androidプログラミング―10の実践サンプルで学ぶAndroidアプリ開発入門
が比較的わかりやすいです。前者は基本的なAPIの利用の仕方をサンプルで書いていてわかりやすいです。後者の本は、基本的なことから扱っていますが、やや複雑な実装のアプリも扱っていて、その場合、どのようにファイルを分割してコーディングしていけばいいかわかります。

3. レイアウトの勉強をするには
あんざい ゆき著のAndroid Layout Cookbook アプリの価値を高める開発テクニックがいいです。

ブログを始めました

ブログを始めました。
Androidアプリの開発を3年ほどやっていて、最近、Titanium MobileとiOSアプリの開発の勉強を始めました。
アプリの開発についてや、世の中のこと、テレビ番組、映画など、いろいろなことを書いていきたいと思います。