В существующем проекте 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, и, побывав в Google, я понимаю, что это способ сделать что-то без блокировки основного (UI) потока, при этом все еще устанавливая изображение в потоке пользовательского интерфейса после декодирования. (по крайней мере, согласно разработчикам android) (который я проверил путем регистрации Thread.currentThread().getName()
в разных местах)
Теперь иногда изображение просто не отображается, а stdout только говорит
I/System.out( 8066): bitmap: [email protected] img: [email protected]
I/System.out( 8066): runnable posted
не содержащий следов сообщений из Runnable. Таким образом, Runnable не run()
, хотя img.post()
возвращает true
. Вытягивание ImageView в onCreate()
и объявление его final
не помогает.
Я не знаю. Просто установка растрового изображения напрямую, при блокировке потока пользовательского интерфейса, действительно исправляет ситуацию, но я хочу, чтобы все было правильно. Кто-нибудь понимает, что происходит здесь?
(ps. все это наблюдалось на Android 1.6 и Android-3 sdk)