gpt4 book ai didi

java - Runnable 发布成功但没有运行

转载 作者:IT老高 更新时间:2023-10-28 20:24:23 25 4
gpt4 key购买 nike

在现有的 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) 线程的情况下做事的方法,同时在解码后仍将图像设置在 UI 线程上。 (at least according to 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 线程,确实可以解决问题,但我想把事情做好。有人明白这里发生了什么吗?

(ps。这都是在 Android 1.6 手机和 android-3 sdk 上观察到的)

最佳答案

如果您查看 View.post 的文档有一些相关信息:

This method can be invoked from outside of the UI thread only when this View is attached to a window.

由于您在 onCreate 中执行此操作,因此有时您的 View 可能还没有附加到窗口。您可以通过覆盖 onAttachedToWindow 来验证这一点并在日志中放入一些内容,并在您发布时进行记录。您会看到,当 post 失败时,post 调用发生在 onAttachedToWindow 之前。

正如其他人提到的,您可以使用 Activity.runOnUiThread或提供您自己的处理程序。但是,如果您想直接从 View 本身执行此操作,则可以简单地获取 View 的处理程序:

view.getHandler().post(...);

如果您有一个包含某种背景加载的自定义 View ,这将特别有用。还有一个额外的好处是不必创建一个新的单独的处理程序。

关于java - Runnable 发布成功但没有运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4083787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com