【问题标题】:Ending an activity on a background thread结束后台线程上的活动
【发布时间】:2014-07-25 05:50:48
【问题描述】:

我认为在非 UI 线程的线程上调用 finish() 是一种不好的做法。当某个事件(在渲染/循环线程中计算)发生时,我需要结束一个活动。

根据对类似问题的回答,使用处理程序发布请求以完成 UI 线程上的活动是合适的。我试图这样做,但活动从未结束 - 在发布之前我必须做些什么,或者我应该使用完全不同的方法吗?

【问题讨论】:

  • 显示您的代码。如果发生任何错误,还有 LogCat..
  • 我很想知道对这个完全有效的问题投反对票的原因。有人请赐教。

标签: java android multithreading android-activity thread-safety


【解决方案1】:

默认情况下,处理程序是在实例化它们的(循环)线程上创建的。要确保处理程序位于主 UI 线程上,您可以这样做:

Handler myHandler = new Handler(Looper.getMainLooper());

然后,要将项目发布到主线程,请创建一个实现Runnable 接口的类,然后发布到处理程序。

myHandler.post(new Runnable() {
  @Override
  public void run() {
     // Code to run on UI thread.
  }
});

另一个方便的花花公子技巧是您可以发布到您的活动可见的View。例如你的根视图。

View myView = findViewById(R.id.myViewId);
Runnable runnableObject = new MyRunnableObject();
myView.post(runnableObject);

关于此的一些注意事项。发布到视图的所有内容都将在 UI 线程上运行。发布到Views 的项目View 出现在视图树上之前不会执行。您可以将 Runnables 发布到您的View,然后它们都会在View 对用户可见的第二秒触发。还需要注意的是,取消已发布到 Views 的Runnables 并不是特别容易。他们在内部使用 Handler,但 remove____() 方法被抽象出来了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多