首页 文章

执行程序服务view.post(Runnable)

提问于
浏览
0

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

我正在使用 Actuator 服务

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 . 它只发生在应用程序的第一次启动时(我使用安卓片段并在onCreateView中填充数据)

2 回答

  • 2

    post 返回true仅表示Runnable已成功放入队列,而不是它运行正常 .

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

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

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

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

  • 1

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

相关问题