2011年11月9日水曜日

AsyncTask 便利だけど注意が必要

Android アプリケーションを開発していると、AsyncTask を利用する機会が
たくさんあると思います。

私が良く使うのは、GridViewやListViewに写真を表示する場合に、
処理時間の掛かる画像ファイルの読み込みを別スレッドで実施するために
AsyncTaskを利用しています。

この時、気をつけなければいけないのはAsyncTaskの呼び出し数です。

例えば1000個の画像ファイルを取得したい時に、1個のファイル毎に
AsyncTaskを呼び出す処理を、for文で実行したりすると
RejectedExecutionExceptionが発生します。
(そんなバカなことをするのは私だけか)

以下のように try~catch で囲んでおきExceptionが発生した場合には、
無視したり、一定時間後に再実行するなど予め対策しておけば問題
ありません。

SampleTask : AsyncTask
try {  SampleTask sampleTask = new SampleTask  sampleTask.execute();} catch(RejectedExecutionException e){  [ユーザ処理]}

2011年11月7日月曜日

ImageView.setImageURI() の動作

自分のAndroidアプリにカメラ機能をつけたいと思った時は、
2つの選択肢がある。

1.sarfaceViewを使って、独自のカメラ機能を作りこむ
2.標準カメラをIntent呼び出しする

どちらの選択肢にもメリット・デメリットはあるが、

画面デザインの統一感や、ギャラリーには保存したくないなど
細かい設定が必要でなければ、「2」をおすすめする。

カメラ機能は、各メーカーで独自仕様のため、「1」を選択すると
思わぬ苦労を背負い込むことになる。

私が「1」を選択した時は、以下のような状態になった・・・

<正常>
IS04(2.1)
IS04(2.2)
GaraxyS(2.3)
Xperia Arc(2.3)

<異常>
HTC Desire HD(2.3)
HTC EVO(2.2)

もちろん一つずつ対応していくことは可能ではあるが、
それには、新しい端末が発表されるたびに動作確認しなければならず
膨大な手間と実機の準備が必要になる。

この時は、「2」を選択することになった。

ただし、「2」を選択しても、考慮すべきことは色々ある。
そのうちの一つである、タイトルに記載した内容について
以下に簡単にまとめる。

ここから、ようやく本題

2つのActivityが存在しており、ここでは「A」と「B」とする。
以下のような処理を行った際に、「2.1」と「2.2」では動作が違うようです。

A で標準カメラ機能を使って撮影した画像のUri オブジェクトを
B にIntentで受け渡し、渡されたUri オブジェクトを使って画像を表示する。

<Aの処理>
File file = new File(dir, filename);
Uri uri = Uri.fromFile(file);
Intent intent.setData(uri);

<Bの処理>
Uri uri = getIntent().getData();
ImageView img = (ImageView) findViewById(R.id.testImg);
img.setImageUri(uri);

上記のコードは、2.2では正常に画像が表示される。
しかし、2.1では特にエラーにはならないが画像は表示されない。

<Bの処理>
Uri uri = getIntent().getData();
File file = new File(uri.getPath());
ImageView img = (ImageView) findViewById(R.id.testImg);
img.setImageUri(Uri.parse(file.toString));

このように書き直すと、2.1、2.2の両方で画像が表示される。

2.1 では、Uri.fromFile() と Uri.parse() で取得できる情報に違いがあるのか・・・
時間ができた時にでも追いかけてみたい。

2011年11月5日土曜日

第5回 Google Developer Days

2011年11月1日に、パシフィコ横浜で開催された「Google Developer Days
に参加してきました。
今年は、世界8カ国で開催されていますが、毎年、開催国は変わっているようです。
そんな中、日本は5回連続で開催されるほどGoogleにとって
日本という国は重要な 位置づけにあるようです。 

こちらに参加するためには、様々な方法がありますが、最もメジャーな方法は、
「DevQuiz」というクイズに答えて正解得点を競うというものになります。

 私は、150点満点中の116点で参加できました。
どうやらボーダーラインは101点以上だったようです。
 満点で参加された強者達もいたようです。 

これは、開発者を対象としているため、出題された問題の回答をプログラムで
作成して提出するという形式になります。
期間は、1ヶ月ぐらいありますが、その間は、Twitterも盛り上がりますので、
お祭り好きなエンジニアは、ぜひ次回は参加してみて下さい。

当日は、朝9時から並んで色々貰ってきました。
Tシャツ、缶バッヂ、スマートフォンコントローラー(zeemote)・・・
















缶バッヂは、最初に10個同じものを渡されて、それを会場の人たちで
交換しあって、揃えていくというゲームになっていました。
すべて揃うと、先着順で更にプレゼントが貰えるという特典付き。

交換という名目でエンジニア同士の交流が進むので以外と面白かったと
思います。
残念ながら私は9個しか揃わなかったので、プレゼントが何だったのか
分かりません。でも十分楽しめました。

基調講演および各セッションは、同時通訳付きなので英語が分からない
人にも十分楽しめました。
開発中のデモもたくさん見せて貰いましたが、Android、Google Apps、
Chrome、Google+などなど、これからが凄く楽しみになりました。













会場では、技術だけでなく、プレゼンも上手いエンジニアにたくさん
会うことができました。
まだまだ学ぶべきことが多いということを実感しましたし、
よい刺激を受けることができました。

エンジニアって楽しいなと思える空間でしたので、
ぜひ多くのエンジニアに参加してほしいです。

参加枠が限られているので競争率が上がりますが、
次回も参加するべく頑張りたいと思います。