如何知道此线程是否是UI线程

时间:2012-10-12 09:15:06

标签: java android ui-thread

如果运行我的代码的线程是UI线程,Android上有没有办法知道?在摇摆中有SwingUtilities.isEventDispatchThread()告诉我我是否在UI线程上。 Android SDK中是否有任何功能让我知道这一点?

4 个答案:

答案 0 :(得分:40)

  1. 从这里借来的答案:How to check if current thread is not main thread

    Looper.myLooper() == Looper.getMainLooper()

  2. 任何Android应用程序只有一个UI线程,因此您可以在Activity回调中的某个位置(如onCreate())检查并存储其ID,然后将该线程的ID与存储的ID进行比较。

    mMainThreadId = Thread.currentThread().getId();

  3. 无论如何,您可以省略检查是否要在UI线程上执行某些操作,并使用

    对Activity进行任何引用
    mActivity.runOnUiThread( new Runnable() {
        @Override 
        public void run() {
        ...
        }
    });
    
  4. 保证在当前线程上运行,如果是UI,或者在UI线程中排队。

答案 1 :(得分:8)

是的,有办法。 针对主lopper的线程对象检查当前线程对象。主循环器总是在UI线程中。

boolean isOnUiThread = Thread.currentThread() == Looper.getMainLooper().getThread();

答案 2 :(得分:0)

实际上由于Android架构,所有活动都在主线程中运行,即UI线程。因此,当您编写活动时,活动中的所有内容都在UI线程中 这就是为什么在Honeycomb中,当你在主线程中进行网络调用时,会添加一个错误:它完全阻止了UI。

因此,默认情况下,您实际上始终在UI线程中工作。 另一件事:除非你明确要求它在另一个线程中,否则服务将在与其应用程序的活动相同的线程上运行。

那么,该怎么办?

  • 当您必须在活动中进行大量计算时;一种解决方案是使用AsyncTask(一种旨在让您轻松使用另一个线程的类)。 onExecute()中的代码在另一个线程中运行(但是在主线程中运行谨慎的postExecute)。另一个是当AsyncTask没有真正适应时手动启动新线程。
  • 如果您创建的服务执行代价高昂的后台任务,请使用清单的android:process =“:my_process”属性在另一个线程中运行。您将需要创建一个AIDL来与此分离的服务进行通信,但这不是一项复杂的任务。
  • 许多对象(例如MediaPlayer)都有其方法的异步变体。尽量一直使用它们。

答案 3 :(得分:-1)

将断点放在要检查的位置,当它被击中时,检查是否可以与UI交互(即,如果UI未被冻结)。如果您无法与UI进行交互,那么您将处于UI线程中,否则您将处于后台线程中。