在大致相同的时间对指令更好的是:多个处理程序,每个具有单个Runnable,还是具有多个Runnable的单个处理程序?

时间:2014-07-25 20:59:20

标签: java android multithreading

因此,在尝试维持轻量级资源负载时,我希望能够立即完成一些事情。例如,播放声音并同时更新GUI。拥有单个runnables的多个处理程序或者并行运行多个runnable的单个处理程序会更好吗?

我知道下面的实现实际上不会同时运行并且由于runnable1中的指令可能比runnable2长(因此runnable1执行时间+ 3000)vs(runnable2 time + 6000)等而被抵消但是,让我们说3000和6000是计算时间的替代品,使其每三秒钟运行一次(取下一个间隔[例如00:00:03.000,00:00:06.000]和当前时间的毫秒差异)。 / p>

private Handler handler1 = new Handler();
private Handler handler2 = new Handler();

   protected void onStart() {
        super.onStart();
          Runnable runnableH1 = new Runnable() {
            @Override
            public void run() {
              /* playSound A,B,C, etc every three seconds */
                    handler1.postDelayed(this, 3000);
                }
            }
        };

          Runnable runnableH2 = new Runnable() {
            @Override
            public void run() {
              /* change GUI A,B,C, etc every six seconds */
                    handler2.postDelayed(this, 6000);
                }
            }
        };

      handler1.postDelayed(runnableH1, 0);
      handler2.postDelayed(runnableH2, 0);
   }

VS

private Handler handler1 = new Handler();

   protected void onStart() {
        super.onStart();
          Runnable runnable1 = new Runnable() {
            @Override
            public void run() {
              /* playSound A,B,C, etc every three seconds */
                    handler1.postDelayed(this, 3000);
                }
            }
        };

          Runnable runnable2 = new Runnable() {
            @Override
            public void run() {
              /* change GUI A,B,C, etc every six seconds */
                    handler1.postDelayed(this, 6000);
                }
            }
        };

      handler1.postDelayed(runnable1, 0);
      handler1.postDelayed(runnable2, 0);
   }

我知道有类似的问题: Android: one handler for all runnables? 但是答案说你从我阅读Android文档时只能使用一个处理程序,听起来你可以实现多个处理程序没有问题(否则IDE会抱怨,它不会抱怨)有多个线程。

1 个答案:

答案 0 :(得分:2)

如果你最后使用处理程序进行的操作是更改视图或将添加到主UI的任何其他任务,那么你可以将一个处理程序附加到主Looper上,这并不重要。或者其中几个,最后所有的处理程序(或你的单个处理程序)都将消息传递到一个队列中,#34;主线程UI队列",所以,没有真正的优势来自"并行/多线程"立场。

就个人而言,我会避免使用多个处理程序,因为它容易出错并且泄漏的可能性更高......

另一方面,如果你没有将你的消息推送到主线程,而你只是并行做一些工作,那么有几个线程是可行的,不一定是几个处理程序,因为你实际上没有#39除非你需要在主线程中发布一些内容,否则确实需要它们。

希望它有所帮助!

此致