Java 安卓是否可以安全地假设;“主/UI线程”;ID总是1?
我正在处理一个包含在其他应用程序中的jar文件,它必须非常健壮 在jar中,我有一个对象,比如说Java 安卓是否可以安全地假设;“主/UI线程”;ID总是1?,java,android,multithreading,Java,Android,Multithreading,我正在处理一个包含在其他应用程序中的jar文件,它必须非常健壮 在jar中,我有一个对象,比如说SomeView,它接受Android上下文,试图创建一个处理程序对象,并将接触视图,因此需要从主线程初始化它。我如何才能100%保证他们不会在错误的线程中初始化我的SomeView 例如: public class SomeView { Handler mHandler; public SomeView(Context context) { mHandler = ne
SomeView
,它接受Android上下文,试图创建一个处理程序
对象,并将接触视图,因此需要从主线程初始化它。我如何才能100%保证他们不会在错误的线程中初始化我的SomeView
例如:
public class SomeView {
Handler mHandler;
public SomeView(Context context) {
mHandler = new Handler();
}
}
i、 e.如果(Thread.currentThread().getId()!=1)故障安全(),则将代码>在构造函数工作中
我怎样才能100%保证他们不会在错误的线程中初始化我的SomeView
将代码包装在Runnable
中,并使用rununuithread()
(在活动上)或post()
(在SomeView
上)确保它在主应用程序线程上运行
i、 e.如果(Thread.currentThread().getId()!=1)故障安全(),则将:;在建设者的工作中
我当然不会指望这一点
使用Looper.getMainLooper().getThread()
获取表示主应用程序线程的Thread
对象。但是,我只想将线程敏感块包装在Runnables
中,并让这些块在主应用程序线程上运行。至于您的第一个建议:SomeView
的构造函数是SomeView(Context Context)
,它允许全局应用程序上下文,它没有任何rununuithread()的概念
(只有活动才能执行)。如果我使用post()?如果开发人员在错误的线程上意外地从我的SomeView
构造函数实例化了mHandler
,它将崩溃为“无法在未调用Looper.prepare()的线程内创建处理程序”@DavidT:“这允许全局应用程序上下文”--不要使用应用程序
上下文创建视图
的实例。“如果我使用post(),我假设我必须使用一个Handler对象?”——post()
也是View
上的一个方法。至于你的第二个建议,我可以假设100%的时间,即使在数百万常规Android股票设备上运行,Thread.currentThread().getId()!=Looper.getMainLooper().getThread().getId()是否正确检查?看起来像是@MTilsted的副本谢谢您的发现。我还想知道,在我的特殊情况下,如果我只想检查线程ID,而不是对象,它会工作得更好。