>source

메인 스레드 (무거운 작업 수행)가 아닌 경우에만 호출하고자하는 방법이 있으며 메인 스레드에서 호출되는 경우 런타임 예외를 던지면 런타임 예외를 던질 수 있습니다. 메인 스레드에서 네트워크 호출이 있고NetworkOnMaintHreadException

나는이 문제에 대해 아무것도 찾지 못했기 때문에 그것을 할 수있는 방법이 있습니까?

@akshay 당신은 심지어 내 질문을 읽었습니까? 이것은 내 질문과 아무 관련이 없습니다

tyczj2021-06-17 22:20:15

@tyczj 죄송합니다, 너무 빨리 읽고 오해, 사과 드리고있었습니다. 나는 당신의 질문을 더 적절하게 해결하는 답변을 더 적절히 해결했습니다.

Akshay2021-06-17 22:20:15

@niekhaarman 나는 "메인 스레드"대신 "UI 스레드"를 검색해야합니다.

tyczj2021-06-17 22:20:15

looper.mylooper ()== looper.getMainLooper ()

pskink2021-06-17 22:20:15
  • 답변 # 1

    현재 스레드를 메인 중 하나와 비교할 수 있습니다.루퍼

    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로 괴롭히는 이유는 무엇입니까? 실제 스레드 객체를 비교하지 않는 이유는 무엇입니까?

    Solomon Slow2021-06-17 22:20:15

    @ jameslarge 항상 ID가 저장하기가 더 쉽습니다. 실제로 원한다면 실제 스레드를 비교할 수 있습니다.

    Akshay2021-06-17 22:20:15

    나는 실제 스레드를 비교하고 싶습니다. 저장 : 64 비트 플랫폼에서 스레드 참조의 크기는 길이의 크기와 동일합니다. 32 비트 플랫폼에서 스레드 참조가 실제로 더 작을 수 있습니다.

    Solomon Slow2021-06-17 22:20:15

    @jameslarge 재미 있고, 나는 그것을 실제로 알지 못했습니다. 그에 따라 내 대답을 업데이트하겠습니다.

    Akshay2021-06-17 22:20:15
  • 이전 JavaScript 제출 실행 기능에있는 버튼
  • 다음 c : 왜 Pthread 뮤텍스를 초기화해야합니까?