执行者服务+ view.post(Runnable)

时间:2012-07-02 12:05:47

标签: android multithreading listview android-fragments threadpool

我想启动多个线程,从网络中检索数据,使用它执行某些操作,然后更改有关此数据的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)”中“允许的任务数”)“post”消息< / p>

我无法弄清楚nTasks如何与view.post运行次数连接。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

返回true的

post仅表示Runnable已成功放入队列,而不是运行正常。

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

一种可能性是bmpToShow为空,在这种情况下,您的日志语句可能会抛出NullPointerException(不确定日志如何在Android上运行)如果您没有捕获它们会丢失它

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

如果bmpToShow为空,可能是由于多种原因,但如果没有看到其余的代码则很难判断。