有没有什么方法可以让Android知道,如果运行我的代码的线程是UI线程还是不是?在秋千有SwingUtilities.isEventDispatchThread()
告诉我,如果我在UI线程,或不。 Android SDK中是否有任何功能让我知道这一点?如何知道这个线程是否是一个UI线程
21
A
回答
39
答案从这里借:How to check if current thread is not main thread
Looper.myLooper() == Looper.getMainLooper()
任何Android应用只有一个UI线程,所以你可以在某处活动回调喜欢的onCreate()检查和存储其ID和稍后将该线程的ID与存储的ID进行比较。
mMainThreadId = Thread.currentThread().getId();
无论如何,你可以省略检查,如果你想使用
mActivity.runOnUiThread(new Runnable() { @Override public void run() { ... } });
这是保证上运行做UI线程上的东西,有活动的任何引用当前线程,如果它是UI,或者在UI线程中排队。
0
嗡嗡声实际上由于Android架构,所有活动都在主线程中运行,即UI线程。所以当你编写一个活动时,活动中的所有内容都在UI线程中。
这就是为什么在Honeycomb中,当您在主线程中进行网络调用时添加了错误:它完全阻止了用户界面。
所以默认情况下,你实际上总是在UI线程中工作。另一件事:除非你明确地要求它在另一个线程中,否则一个服务将与其应用程序的活动在同一线程上运行。
那么,该怎么办?
- 当您必须在您的活动中进行繁重的计算;一种解决方案是使用AsyncTask(一个旨在允许您轻松使用另一个线程的类)。 onExecute()中的代码在另一个线程中运行(但要谨慎,在您的主线程中运行postExecute)。另一个是当AsyncTask没有真正适应时手动启动一个新的线程。
- 如果您创建一个执行昂贵后台任务的服务,请使用清单的android:process =“:my_process”属性使其在另一个线程中运行。您需要创建一个AIDL来与这个分离的服务进行通信,但这不是一个复杂的任务。
- 许多对象,例如MediaPlayer,都有其方法的异步变体。尽量始终使用它们。
-1
在你想检查的地方放一个断点,当它被打到时,检查你是否可以和你的UI进行交互(例如,如果UI没有被冻结)。如果你不能与UI进行交互,那么你就在UI线程中,否则你就在后台线程中。
8
是的,有一种方法。 检查当前线程对象与主线程对象的线程对象。主要的looper总是在UI线程中。
boolean isOnUiThread = Thread.currentThread() == Looper.getMainLooper().getThread();
相关问题
- 1. UI线程如何知道另一个线程上的数据?
- 2. Python线程 - 如何知道线程是否已在运行?
- 3. 这是否在UI线程上运行
- 4. 如何让1个UI线程等待另一个UI线程
- 5. 如何知道是谁开始线程
- 6. Android:每个UI线程在一个Activity中是否有独立的线程?
- 7. Python,是否适合一个线程产生另一个线程
- 8. 如何知道nuget工具是否是线程安全的(.NET)?
- 9. 如何知道谁是给定线程ID的父线程
- 10. 这个类是否线程安全?
- 11. 我如何知道在Windows CE下是否挂起一个线程?
- 12. 如何知道另一个线程是否正在访问资源?
- 13. 如何知道一个线程是否在SWT环境中完成其任务?
- 14. 一个线程如何确定另一个线程是否已经崩溃?
- 15. Reskit - 回调在同一个线程而不是UI线程
- 16. 如何知道所有线程池的线程是否已完成其任务?
- 17. 是否有可能知道哪个线程先完成?
- 18. 对于一个多线程程序,如果一个线程死亡,你怎么知道这个?
- 19. 在另一个线程中使用线程是否是一个好习惯?
- 20. 单线程进程是否只包含一个线程?
- 21. 如何知道用户是否在线?
- 22. 关于UI线程的这个工作是如何进行的
- 23. AsynckTask.onPostExecute和FragmentActivity.onResumeFragments是否在同一个线程(ui线程)上运行?
- 24. 如何知道我是否在UI线程上执行某些操作?
- 25. 这是一个java代码是否线程安全?
- 26. 如何知道是否有流水线输入到perl程序
- 27. 如何知道线程执行是否终止?
- 28. 如何知道是否有活动的线程?
- 29. 如何知道线程是否还活着然后杀死它?
- 30. 如何知道线程是否在Perl中使用die
为什么你需要知道你的代码在哪个线程上运行?如果它是用于UI线程的,则只需将其分派到那里。 –
您通常只是知道何时在ui线程上执行某个方法。任何情况下,特别是你有什么疑问? – njzk2
没有特定的情况。只是确定我的多线程代码的一种方法。 – user1730789