2012-10-12 125 views
21

有没有什么方法可以让Android知道,如果运行我的代码的线程是UI线程还是不是?在秋千有SwingUtilities.isEventDispatchThread()告诉我,如果我在UI线程,或不。 Android SDK中是否有任何功能让我知道这一点?如何知道这个线程是否是一个UI线程

+1

为什么你需要知道你的代码在哪个线程上运行?如果它是用于UI线程的,则只需将其分派到那里。 –

+0

您通常只是知道何时在ui线程上执行某个方法。任何情况下,特别是你有什么疑问? – njzk2

+0

没有特定的情况。只是确定我的多线程代码的一种方法。 – user1730789

回答

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

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

  2. 任何Android应用只有一个UI线程,所以你可以在某处活动回调喜欢的onCreate()检查和存储其ID和稍后将该线程的ID与存储的ID进行比较。

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

  3. 无论如何,你可以省略检查,如果你想使用

    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(); 
相关问题