【问题标题】:executor service + view.post(Runnable)执行器服务 + view.post(Runnable)
【发布时间】:2012-07-02 20:21:58
【问题描述】:

我想启动几个线程,从网络中检索数据,对其执行一些操作,然后更改有关这些数据的 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 运行次数相关联。

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

【问题讨论】:

    标签: android multithreading listview android-fragments threadpool


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-18
        • 2016-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多