【问题标题】:Check what thread a method is being called from [duplicate]检查从[重复]调用方法的线程
【发布时间】:2014-10-07 01:59:06
【问题描述】:

我有一个方法,我只想在不在主线程时调用(工作繁重),如果从主线程调用它,我会抛出运行时异常,类似于您尝试执行时发生的情况主线程上的网络调用,你得到一个NetworkOnMainThreadException

我在这个问题上没有找到任何东西,所以有什么办法吗?

【问题讨论】:

  • @Akshay 你有没有读过我的问题!?这与我的问题无关
  • @tyczj 对不起,我读得太快了,误解了,我很抱歉。我在下面添加了一个答案,希望能更恰当地解决您的问题。
  • @NiekHaarman 我想我应该搜索“UI 线程”而不是“主线程”
  • Looper.myLooper() == Looper.getMainLooper()

标签: java android multithreading


【解决方案1】:

您可以将当前线程与主要Looper之一进行比较

if (Thread.currentThread() == Looper.getMainLooper().getThread())
    throw new IllegalStateException();

【讨论】:

    【解决方案2】:

    您可以使用Thread.currentThread() 获取对当前线程的引用。如果您记得启动时的主线程,您可以验证该方法是从正确的线程调用的。

    例如,你可以这样写:

    // At the start of the main thread, keep a reference
    
    Thread mainThread;
    
    public void mainThreadMethod()
    {
        mainThread = Thread.currentThread();
        // ...
    }
    
    // In the relevant method, check the thread you're on
    
    public void myMethod()
    {
        if(Thread.currentThread().equals(mainThread))
        {
            throw new RuntimeException("Method called from main thread");
        }
        // ...
    }
    

    【讨论】:

    • 为什么要打扰ID?为什么不直接比较实际的 Thread 对象呢?
    • @jameslarge 我一直认为 ID 更容易存储。如果你真的想的话,我想你可以比较实际的Threads。
    • 我真的很想比较实际的线程,因为它的方法调用更少。至于存储:在 64 位平台上,Thread 引用的大小将与 long 的大小相同。在 32 位平台上,线程引用实际上可能更小。
    • @jameslarge 有趣,我实际上并不知道。我会相应地更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多