既存の Android プロジェクトで、次のコードに遭遇しました (デバッグごみを挿入した場所)。
ImageView img = null;
public void onCreate(...) {
img = (ImageView)findViewById(R.id.image);
new Thread() {
public void run() {
final Bitmap bmp = BitmapFactory.decodeFile("/sdcard/someImage.jpg");
System.out.println("bitmap: "+bmp.toString()+" img: "+img.toString());
if ( !img.post(new Runnable() {
public void run() {
System.out.println("setting bitmap...");
img.setImageBitmap(bmp);
System.out.println("bitmap set.");
}
}) ) System.out.println("Runnable won't run!");
System.out.println("runnable posted");
}
}.start();
Android 開発は初めてで、ググってみましたが、これがメイン (UI) スレッドをブロックせずに、デコード後に UI スレッドに画像を設定する方法であることを理解しています。(少なくともandroid-developersによると)Thread.currentThread().getName()
(さまざまな場所でログを記録して確認しました)
現在、画像が表示されないことがあり、標準出力には次のように表示されるだけです
I/System.out( 8066): bitmap: android.graphics.Bitmap@432f3ee8 img: android.widget.ImageView@4339d698
I/System.out( 8066): runnable posted
Runnable からのメッセージの痕跡はありません。どうやらランナブルはそうではありませんrun()
が、img.post()
戻りますtrue
。ImageView をプルしonCreate()
て宣言しfinal
ても役に立ちません。
私は無知です。UIスレッドをブロックしながらビットマップを直接設定するだけで問題は解決しますが、私は物事を正しくしたいと考えています。誰かがここで何が起こっているのか理解していますか?
(ps。これはすべてAndroid 1.6電話とandroid-3 SDKで観察されました)