Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓是否可以安全地假设;“主/UI线程”;ID总是1?_Java_Android_Multithreading - Fatal编程技术网

Java 安卓是否可以安全地假设;“主/UI线程”;ID总是1?

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

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

在jar中,我有一个对象,比如说
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,而不是对象,它会工作得更好。