java - 对于大致相同时间 : multiple Handlers with single Runnable each, 的指令或具有多个 Runnable 的单个 Handler 来说,哪个更好?

标签 java android multithreading

因此,我希望在尝试保持轻资源负载的同时,同时完成几件事。例如,同时播放声音和更新GUI。多个处理程序与单个可运行对象更好,还是单个处理程序与多个可运行对象并行运行更好?

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

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);
   }

对比

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 会提示,但它不会)拥有多个线程。

最佳答案

如果最终您对处理程序所做的只是更改 View 或将添加到主 UI 的任何其他任务,这并不重要,您可以将单个处理程序附加到主 Looper 和/或多个其中,最终所有处理程序(或单个处理程序)都会将消息传输到单个队列中,即“主线程 UI 队列”,因此,从“并行/多线程”的角度来看,没有真正的优势。

就我个人而言,我会避免使用多个处理程序,因为这很容易出错并且发生泄漏的机会更高......

另一方面,如果您没有将消息推送到主线程,而是只是并行地执行一些工作,那么可以使用多个线程,而不一定是多个处理程序,因为您实际上不需要除非您需要将某些内容发布到主线程中,否则确实需要它们。

希望对你有帮助!

问候

关于java - 对于大致相同时间 : multiple Handlers with single Runnable each, 的指令或具有多个 Runnable 的单个 Handler 来说,哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24964411/

相关文章:

java - Windows 已聚焦 - 忽略多线程后的焦点增益

java - 如何在我的泛型方法中限制只接受一种类型?

java - 如何从 linux 中的文件夹导入 java 文件?

java - FTPClient 和 BufferedReader

java - Android 自定义进度对话框 - setCancelable()

c# - 这个线程安全吗?

java - Maven编译错误: cannot find symbol

java - 工作流(即有向图)基于浏览器的编辑器

android studio突然显示完整的文件夹名称,如何更改

java - Java Visual VM 中的实际运行线程