android 체크 안드로이드 java.lang.IllegalArgumentException:서비스가 등록되지 않았습니다




spring url 접근 (4)

이 예외의 또 다른 이유는 unbindService 가 잘못된 Context 의해 호출 unbindService 수 있습니다. 서비스는 활동뿐만 아니라 Context (BroadcastReceivers 제외)에 의해 상속 된 다른 인스턴스에 의해 바인딩 될 수 있기 때문에 다른 서비스에서도 unbindService 가 바인딩 된 Service 가 아닌 컨텍스트에 의해 호출되어야합니다 Service 자체. 이것은 위의 "Service not registered"예외를 직접적으로 산출합니다.

다음과 같은 설정이 있습니다.

class MyFragment implements SomeEventListener {

    Application mAppContext;    

    boolean mBound;
    boolean mDidCallUnbind;
    MyIBinder mBinder;
    ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mBound = true;
            mBinder = (MyIBinder) service;
            mBinder.getThings();...
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mDidCallUnbind = false;
            mBound = false;
            mBinder = null;
        }
    };

    ...

    @Override
    public void onSomeEvent() {
        mAppContext.bindService(...);
    }

    void unbindService() {
        if (mBound && !mDidCallUnbind) {
            mDidCallUnbind = true;
            mAppContext.unbindService(mConnection);
        }
    }

    @Override
    public void onPause() {
        unbindService();
        super.onPause();
    }
}

그러나 때때로 제목에서 오류가 계속 발생합니다. java.lang.IllegalArgumentException: Service not registered unbindService() 가 호출 될 때 java.lang.IllegalArgumentException: Service not registered 가 생성 java.lang.IllegalArgumentException: Service not registered . 어리석은 것을 놓치고 있습니까, 아니면 더 많은 일이 있습니까? 나는이 동일한 조각이 하나 이상 존재할 수 있음을 명심해야한다.

편집하다

아무도 실제로 코드를 읽는 것 같지 않으므로 설명하겠습니다. unbindService()unbindService() 대한 이전 호출에서 onServiceDisconnected(...) 콜백이 발생하기 전에 서비스가 바인딩 ( mBound ) 되고 이전에 호출되지 않은 경우 Context.unbindService(ServiceConnection) 호출하지 않습니다.

즉, 안드로이드가 서비스가 언 바운드되지만 onServiceDisconnected가 호출되지 않아서 나를 부실 상태로 만드는 등의 서비스가 바인딩 해제되는 경우가 있습니까?

또한 초기 바인딩을 수행하기 위해 응용 프로그램 컨텍스트를 사용하고 있습니다. 다음과 같이 가정합니다.

@Override
public void onCreate() {
    mApplication = getContext().getApplicationContext();
}

java.lang.IllegalArgumentException: Service not registered 되지 않은 서비스는 unbindService() 가 호출되었을 때 서비스에 바인드되지 않았 음을 의미합니다.

따라서 unbindService()onPause() 에서 unbindService() 를 호출하기 전에 호출되지 않았습니다.


내 응용 프로그램과 정확히 같은 문제가 있습니다. 때때로 나는 IllegalArgumentException 얻는다. 특수한 경우는 서비스가 언 바운드되고 onPauseonServiceDisconnected 보다 먼저 호출 될 때 발생합니다. 그래서 나는 올바른 실행을 보장하기 위해 Synchronized 것을 시도 할 것이다.


나는이 질문이 이미 응답되었음을 깨닫는다. 그러나 사람들이 왜 이런 실수를 저지르고 있는지에 대한 이유가 있다고 생각합니다.

문제는 실제로 교육 문서와 관련이 있습니다. 'ActivityMessenger'의 https://developer.android.com/guide/components/bound-services.html 은 올바른 구현을 보여주는 http://developer.android.com/reference/android/app/Service.html . 매우 부정확 한 구현.

'ActivityMessenger'예제에서 onStop ()은 잠재적으로 서비스가 실제로 바인딩되기 전에 호출 될 수 있습니다.

이 혼동을 일으키는 이유는 서로 다른 예제에서 다른 것을 의미하기 위해 바운드 서비스 부울을 사용하기 때문입니다. (주로 bindService ()가 OR이라는 서비스가 실제로 연결된 서비스 임)

바인드 된 부울 값에 따라 unbind ()가 수행되는 올바른 예에서 바인드 된 부울은 bindService ()가 호출 되었음을 나타냅니다. 메인 쓰레드 실행을 위해 대기하고 있기 때문에 onServiceConnected ()가 일어날 때와 관계없이 unbindService ()를 호출해야하므로 (실행 대기열에 넣기 위해) 호출해야합니다.

http://developer.android.com/reference/android/app/Service.html 있는 것과 같은 다른 예에서. 바인딩은 서비스가 실제로 바인딩되어 NullPointerException을 사용하지 않고 사용할 수 있음을 나타냅니다. 이 예제에서 unbindService () 호출은 여전히 ​​만들어지고 바인드 된 부울은 바인딩을 해제할지 여부를 결정하지 않습니다 .





android-service-binding