2012-06-11 2 views
1

내 서비스와 활동간에 양방향 통신을 시도하고 있습니다. 이렇게하려면 보통처럼 내 서비스를 시작하고 replyTo가 포함 된 메시지를 내 활동의 메신저로 보내고 내 서비스로 보냅니다. 그렇게하면 양쪽 방향으로 메시지를 보낼 수있는 참조가 있습니다. mService이 시간에 널 (null)이기 때문에서비스가 초기화되지 않았으므로 NullPointerException이 반환됩니다.

private Messenger mService = null; 
private final Messenger mMessenger = new Messenger(new IncomingHandler()); 

private ServiceConnection mConnection = new ServiceConnection() 
{ 
    public void onServiceConnected(ComponentName className, IBinder service) 
    { 
     mService = new Messenger(service); 
     mBound = true; 
    } 

    public void onServiceDisconnected(ComponentName className) 
    { 
     mService = null; 
     mBound = false; 
    } 
}; 

private void initMessenger() 
{ 
    Message messageHandler = Message.obtain(null, NetworkService.MSG_GET_HANDLER, 0, 0); 
    messageHandler.replyTo = mMessenger; //Set the replyTo to give a reference 
    try 
    { 
     mService.send(messageHandler); 
    } 
    catch(RemoteException e) 
    { 
     e.printStackTrade(); 
    } 
    catch(NullPointerException e) 
    { 
     e.printStackTrace(); //Why!!! 
    } 
} 

public void onCreate() 
{ 
... 
    //Create the intent to start the network service 
    Intent iService = new Intent(this, NetworkService.class); 
    int[] connectionConfig = {CONNECTION_BT}; 
    iService.putExtra(CONNECTION_CONFIG, connectionConfig); 
    bindService(iService, mConnection, Context.BIND_ABOVE_CLIENT); 
    startService(iService); 
    initMessenger(); 
} 

가 NullPointerException이는 내가 mService.send을 (를 호출 할 때 발생합니다), 대부분 : 여기 내 Activty에서 몇 가지 관련 코드입니다. 버튼의 OnClickListener 안에 initMessenger() 코드를 옮기면 혼란이 오는 곳에서 잘 작동합니다. 서비스를 사용하기 시작한 후 일정 시간을 기다려야합니까?

답변

2

mService이 단계에서 null은 현재까지 귀하의 서비스가 (아직) onServiceConnected()을 호출하지 않았 음을 나타냅니다.

불행히도 documentationbindService()이 돌아오고 ServiceConnection의 메소드가 호출되는 사이에 간격이있을 것이라고 제안하지 않습니다.

Infact, bindService()은 서비스가 시작되었을 때 true을 반환해야합니다. 코드가이 단계를 통과하면 서비스가 시작되어야합니다. 따라서 bindService()가 true을 반환했는지 또는 서비스가 올바르게 시작하지 못했기 때문에 initMessenger()을 호출하기 전에 확인했는지 확인합니다.

onServiceConnected()의 코드가 예외를 throw하고있을 가능성이 있습니다 (작업 스레드에서 호출 될 수 있기 때문에 앱이 중단되지 않을 수 있음). 로그에서 이것이 맞는지 확인하십시오. 또한

, startService(iService);이 맥락에서 중복 서비스에 startService를 호출 bindService()시작 서비스는 단순히 메시지의 전송합니다.

1

예. 서비스를 사용해야한다는 사실을 알고 나면 서비스를 사용해야합니다. 서비스를 바인딩하려고 시도한 직후 서비스를 사용하려고하기 때문에 서비스에 연결된다는 보장은 없습니다. 때로는 서비스가 즉시 바인드되어 충돌을 일으키지 않을 수도 있습니다. 때로는 서비스가 아직 연결되지 않았으므로 initMessenger()으로 전화하면 NPE가 발생합니다.

initMessenger() 버튼을 클릭하여 호출하면 서비스 시간이 바인딩됩니다. 또한 바인딩이 실패 할 수 있기 때문에 바운드 여부를 확인해야합니다.

3

onServiceConnected() 메서드에서 initMessenger()을 호출하지 않는 이유는 무엇입니까? 그렇게하면 mService이 할당됩니다.

관련 문제