2011-04-07 5 views
2

나는 아마도 간단한 질문을 가지고있다. 나는 안드로이드 서비스를 가지고있다. 여기서 나는 자물쇠를 요청하고 별도의 스레드에서 실제 (확장) 서비스 코드를 실행하는 일반 서비스 클래스를 만들었습니다. 아래 예 :Android 서비스를 UI 스레드에서 실행해야하는 이유는 무엇입니까?

abstract public class ParentService extends Service { 


public static void getLocks(Context context) { 
     //code to get locks 
} 

public abstract void doServiceJob(); 

@Override 
public void onCreate() { 
    super.onCreate();  
    //Run the service code in separate thread 
    Thread serviceThread = new Thread() { 
     public void run() { 
      //Looper.prepare(); 
      doServiceJob(); 
      //Looper.loop(); 
     } 
    }; 
    serviceThread.start(); 
} 

@Override 
public void onDestroy() { 
     //release locks 
} 
} 

위의 예에서; 호출 된 스레드에서 Looper.prepare() 및 Looper.loop()이 호출되지 않아도 모든 것이 올바르게 작동합니다.

그러나 GPS 또는 네트워크를 통해 위치를 얻으려고하면; 문제가 발생하고 코드가 "Looper.prepare()"를 호출하지 않은 스레드 내부에서 처리기를 만들 수 없다는 내용의 코드가 실행되지 않습니다.

UI 스레드와 통신하려면 루퍼와 핸들러를 만들어야한다는 것을 알고 있습니다. UI에 영향을주는 이벤트 그러나 가져 오기 위치가 UI에 영향을 줍니까? 그것은 위치 공급자가 내 전화 상단 표시 줄에 GPS 아이콘을 그리기 위해 시도 할 것이고 UI 스레드에서 실행 중이 지 않기 때문입니다. 그럴 수 없어?

무엇이 문제인지 여기에서 looper.prepare() 및 Looper.loop();을 호출하여이 문제를 해결할 수 있습니다. 그러나 나는 다음 일들을 이해해야한다.

  • 서비스가 메인 스레드에서 실행되는 것을 알고 있습니다. 이것은 UI 스레드와 동일합니다. 이는 효과적으로 서비스가 UI를 변경할 수있는 능력을 가지고 있으며 사용자 경험이 좋지 않고 알림을 통해 모든 것을 전달하는 이유이기 때문에 서비스를 제공하지 않는다는 의미입니다. (심지어 UI 스레드에서 알림을 실행해야합니까?)
  • 위치 공급자가 UI 스레드에서 실행해야하는 이유는 무엇입니까?
  • 여기에 핸들러를 선언하지 않고 있습니다. looper.prepare()를 호출하고 있습니다. 그렇다면 메시지 대기열은 백그라운드에서 어떻게 작동하며 아래에서 안드로이드 코드에서 어떤 일이 발생합니까?

이 질문에 대한 답변과 포인터는 도움이 될 것입니다. 귀하의 도움에 미리 감사드립니다.

건배

+0

앱의 서비스와 활동을 같은 스레드에두기로 결정했을 때 상황을 단순화하고 MT 비용을 줄이는 것이었을 수 있습니다. 그냥 내 추측 :). 커널이 처리해야하는 쓰레드가 줄고 동시성 문제도 없습니다. – seand

답변

1

당신이 Looper.Loop이 배경 작업이 전경 스레드에서 코드를 실행되는 경로를 제공한다는 것입니다 전화를해야하는 이유. 백그라운드 스레드의 메시지는 Handler 개체를 사용하여 UI 스레드에 게시되며 UI 스레드가 실제 메시지를 처리하기 위해 Looper.Loop을 호출해야합니다. 그것이 메시지 처리가 이루어지는 곳입니다 : Looper.Loop 호출.

관련 문제