0

我想启动几个线程,从网络中检索数据,使用它执行一些操作,然后更改有关此数据的 UI。

我正在使用执行器服务

executorService = Executors.newFixedThreadPool(3);

所有数据都得到了,但是当我尝试调用 imageView.post 它返回 true 但有关 Runnable 的主体未执行:

Log.v("imageloader", "before post + " + imageView);
imageView.post(new Runnable()
{
    @Override
    public void run()
    {
         Log.v("imageloader", "in post - " + bmpToShow.toString() + "/" + imageView);
         if (imageView.getTag().equals(url))
         {
             imageView.setImageBitmap(bmpToShow);
         }
    }
});

如果在日志中的这个执行器服务中执行 10 个 Runnables,您可以找到 10 条“发布前”消息,但只有 nTasks(取决于您在“Executors.newFixedThreadPool(nTasks)”中允许多少任务)“发布后”消息

我无法弄清楚 nTasks 如何与 view.post 运行次数相关联。

PS。它仅在应用程序的第一次启动时发生(我使用 android 片段并在 onCreateView 中填充数据)

4

2 回答 2

2

哇,问题是在某些情况下(我不知道它取决于什么)ImageView.post 中的代码没有执行(可能这个视图还没有创建),我在 runOnUiThread() 上更改了 Imageview.post(),现在一切正常.

于 2012-07-05T06:11:37.267 回答
1

post返回 true 仅意味着 Runnable 已成功放入队列,而不是运行正常。

你怎么知道“Runnable 的主体没有被执行”?

一种可能性是bmpToShow空值,在这种情况下,您的日志语句可能会抛出一个NullPointerException(不确定日志在 Android 上如何工作),如果您不抓住它,它将丢失。

您可以在输入 runnable 时添加另一个日志以首先检查Log.v("in runnable with " + bmpToShow);

如果bmpToShow为空,可能有多种原因,但如果不查看其余代码则很难判断。

于 2012-07-02T12:17:04.010 回答