W istniejącym projekcie Android Napotkałem następujący fragment kodu (gdzie włożeniu śmieci debugowania)Runnable jest wysłana pomyślnie, ale nie uruchamiać
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();
nowego do rozwoju Android i zebrana wokół google, ja zrozum, że jest to sposób na robienie rzeczy bez blokowania głównego wątku (UI), przy jednoczesnym ustawianiu obrazu w wątku UI po dekodowaniu. (at least according to android-developers) (który został zweryfikowany przez zalogowaniu Thread.currentThread().getName()
w różnych miejscach)
Teraz czasami obraz po prostu nie pojawi się, a stdout tylko mówi
I/System.out(8066): bitmap: [email protected] img: [email protected]
I/System.out(8066): runnable posted
z nie śladu wiadomości z Runnable. Wygląda więc na to, że Runnable nie ma wartości run()
, chociaż img.post()
zwraca . Wywołanie ImageView w onCreate()
i zadeklarowanie go jako final
nie pomoże.
Nie mam pojęcia. Samo ustawienie bitmapy bezpośrednio, podczas blokowania wątku UI, naprawia pewne rzeczy, ale chcę wszystko naprawić. Czy ktoś rozumie, co tu się dzieje?
(ps. To wszystko było zaobserwować na Android 1.6 telefonu i Android-3 SDK)
podobne pytania z przydatnych odpowiedzi: [Jaka jest różnica między Activity.runOnUiThread (runnable działania) i Handler.post()?] (Http: // stackoverflow .pl/questions/1839625/whats-the-difference-between-activity-runonuithreadrunnable-action-and-handler), [Różnica między Handler.post (Runnable r) i Activity.runOnUiThread (Runnable r)] (http://stackoverflow.com/questions/7452884/difference-between-handler-postrunnable-r-and-activity-runonuithreadrunnable) –