1

サービスとアクティビティの設定の間で双方向の通信を確立しようとしています。これを行うには、通常どおりサービスを開始し、アクティビティでメッセンジャーにreplyToを設定してメッセージを送信し、サービスに送信します。そうすれば、双方向にメッセージを送信するためのリファレンスがあります。これが私のアクティビティの関連コードです:

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();
}

mService.send()を呼び出そうとすると、NullPointerExceptionがスローされます。これは、その時点でmServiceがnullであることが原因である可能性があります。ボタンのOnClickListener内でinitMessenger()コードを移動すると、問題が発生します。サービスを開始してから一定時間待機して使用する必要がありますか?

4

3 に答える 3

3

メソッドを呼び出してみませんinitMessenger()か?onServiceConnected()そのようmServiceに割り当てられるのは確実です。

于 2012-06-11T15:12:47.020 に答える
2

mServiceこの段階にnullあるということは、この時点であなたのサービスが(まだ)電話をかけていないことを示唆していますonServiceConnected()

残念ながら、ドキュメントbindService()は、返されることと呼び出されるメソッドとの間にギャップがあることを示唆していませんServiceConnection

実際、サービスが開始されたときにbindService()戻る必要trueがあります。つまり、コードがこの段階を通過すると、サービスが開始されるかどうかが決まります。したがって、サービスが正しく開始されなかった可能性があるため、true呼び出す前にbindService()が戻ったかどうかを確認します。initMessenger()

内のコードonServiceConnected()が例外をスローしている可能性もあります(ワーカースレッドで呼び出されている可能性があるため、アプリがクラッシュする可能性はありません)。ログをチェックして、これが例外であるかどうかを確認することをお勧めします。場合。

また、startService(iService);このコンテキストでは冗長であり、サービスをbindService() 開始し、サービスを呼び出すstartServiceだけでメッセージを送信します。

于 2012-06-11T15:16:32.960 に答える
1

はい。サービスに拘束されていることがわかった場合にのみ、サービスを使用する必要があります。サービスにバインドしようとした直後にサービスを使用しようとしているため、サービスに接続することを保証するものではありません。クラッシュしないように、サービスがすぐにバインドされる場合があります。initMessenger()サービスがまだ接続されていないため、に電話をかけるとNPEになる場合があります。

通話をボタンクリックに移動するinitMessenger()と、サービス時間が拘束されます。さらに、バインディングが失敗する可能性があるため、(時間を与えても)バインドされていることを確認する必要があります

于 2012-06-11T15:11:42.917 に答える