感谢一个非常有趣的问题。
事实证明,UI和主线程不一定相同。但是,正如您引用的文档中所述,区别仅在某些系统应用程序(作为操作系统的一部分运行的应用程序)的上下文中很重要。因此,只要您不构建自定义ROM或为手机制造商定制Android,我就不用费心去做任何区别了。
答案很长:
首先,我找到了将@MainThread和@UiThread注释引入支持库的提交:
commit 774c065affaddf66d4bec1126183435f7c663ab0
Author: Tor Norbye
Date: Tue Mar 10 19:12:04 2015 -0700
Add threading annotations
These describe threading requirements for a given method,
or threading promises made to a callback.
Change-Id: I802d2415c5fa60bc687419bc2564762376a5b3ef
评论中不包含与该问题相关的任何信息,因为我没有与Tor Norbye(叹气)的沟通渠道,所以这里没有运气。
也许这些注释正在AOSP的源代码中使用,我们可以从那里获得一些见解?让我们搜索AOSP中任何一个注释的用法:
aosp $ find ./ -name *.java | xargs perl -nle 'print "in file: ".$ARGV."; match: ".$& if m{(\@MainThread|\@UiThread)(?!Test).*}'
aosp $
上面的命令会在AOSP中的任何.java文件中找到@MainThread或@UiThread的任何用法(后面没有附加的测试字符串)。它一无所获。这里也没有运气。
所以我们需要去寻找AOSP来源的提示。我猜我可以从Activity#runOnUiThread(Runnable)方法开始:
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
这里没什么特别有趣让我们看看如何初始化mUiThread成员:
final void attach(Context context, ActivityThread aThread,
Instrumentation instr, IBinder token, int ident,
Application application, Intent intent, ActivityInfo info,
CharSequence title, Activity parent, String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config, String referrer, IVoiceInteractor voiceInteractor)