在一个现有的Android项目中,我遇到了下面这段代码(其中我插入了调试信息):
没有任何来自Runnable的消息痕迹。因此,显然Runnable没有运行(run()),尽管img.post()返回true。在onCreate()中拉动ImageView并声明它为final也无济于事。
我很困惑。直接设置位图可以解决问题,但会阻塞UI线程,我想把事情做对。有人能理解这里发生了什么吗?
(附:这全部是在Android 1.6手机和android-3 sdk上观察到的)
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-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的消息痕迹。因此,显然Runnable没有运行(run()),尽管img.post()返回true。在onCreate()中拉动ImageView并声明它为final也无济于事。
我很困惑。直接设置位图可以解决问题,但会阻塞UI线程,我想把事情做对。有人能理解这里发生了什么吗?
(附:这全部是在Android 1.6手机和android-3 sdk上观察到的)