【问题标题】:Android Is it safe to assume the "main/UI thread" ID is always 1?Android 假设“主/UI 线程”ID 始终为 1 是否安全?
【发布时间】:2014-01-03 06:26:00
【问题描述】:

我正在处理一个包含在其他应用程序中的 jar 文件,它必须非常健壮。

在 jar 中,我有一个对象,比如 SomeView,它接受一个 Android 上下文,尝试创建一个 Handler 对象,并且会触摸视图,所以它需要从主线程初始化。我如何保证 100% 他们不会在错误的线程中初始化我的 SomeView

如:

public class SomeView {
    Handler mHandler;
    public SomeView(Context context) {
        mHandler = new Handler();
    }
}

即构造函数中的if (Thread.currentThread().getId() != 1) failSafely(); 会起作用吗?

【问题讨论】:

  • @MTilsted 感谢您的发现。我还想知道,在我的特殊情况下,如果我只想检查线程 ID,而不是对象,它会更好。

标签: java android multithreading


【解决方案1】:

我如何保证 100% 他们不会在错误的线程中初始化我的 SomeView?

将您的代码包装在Runnable 中并使用runOnUiThread()(在Activity)或post()(在SomeView)以确保它在主应用程序线程上运行。

即将 if (Thread.currentThread().getId() != 1) failSafely();在构造函数中工作?

我当然不会指望这一点。

使用Looper.getMainLooper().getThread() 获取代表主应用程序线程的Thread 对象。但是,我只是将线程敏感块包装在 Runnables 中,并让这些块在主应用程序线程上运行。

【讨论】:

  • 关于你的第一个建议:SomeView 的构造函数是SomeView(Context context),它允许一个全局应用程序上下文,它没有任何runOnUiThread() 的概念(只有Activity 有)。如果我使用post(),我假设我必须使用Handler 对象?如果开发人员不小心在错误的线程上从我的 SomeView 的构造函数中实例化了 mHandler,它将崩溃并显示“无法在未调用 Looper.prepare() 的线程内创建处理程序”
  • @DavidT.: “允许全局应用程序上下文”——不要使用 Application 上下文创建 View 的实例。 “如果我使用 post(),我假设我必须使用 Handler 对象?” -- post() 也是View 上的一个方法。
  • 至于您的第二个建议,我是否可以假设 100% 的时间,即使在数百万常规 Android 库存设备上运行,Thread.currentThread().getId() != Looper.getMainLooper().getThread().getId() 是正确的检查?
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 2016-12-13
相关资源
最近更新 更多