9

アクティビティで成功したのと同じ方法でフラグメントからサービスをバインドしようとしていますが、サービスでメソッドを呼び出そうとすると NullPointerException が発生します - 明らかにサービスが null であるためです。onStart のサービスへのバインドに問題がありますか、それとも単に間違っていますか?

@Override
public void onStart() {
    super.onStart();

    Intent intent = new Intent(getActivity(), LiteTrickService.class);
    getActivity().registerReceiver(receiver, new IntentFilter(LiteTrickService.BROADCAST_ACTION));
    getActivity().registerReceiver(receiver, new IntentFilter(LiteTrickService.BROADCAST_FAIL));
    getActivity().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}

@Override
public void onStop() {
    super.onStop();
    getActivity().unbindService(mConnection);
    getActivity().unregisterReceiver(receiver);
    mBound = false;
}

編集:申し訳ありません。この質問を十分に考えなかったのは私の間違いです。mConnection は ServiceConnection であり、次のようになります。

private ServiceConnection mConnection = new ServiceConnection() 
{

    @Override
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
    }
};

スタックトレース :

01-03 15:21:22.355: E/AndroidRuntime(12360): FATAL EXCEPTION: main
01-03 15:21:22.355: E/AndroidRuntime(12360): java.lang.NullPointerException
01-03 15:21:22.355: E/AndroidRuntime(12360):    at lite.hattrick.players.PlayerRankingFragment.onOptionsItemSelected(PlayerRankingFragment.java:205)

そして、これは例外がスローされる正確な場所です: case POPULATE_ID:

        if (hasData) {
            return false;
        }
        if(!mBound)
            getActivity().bindService(new Intent(getActivity().getApplicationContext(), LiteTrickService.class), mConnection, Context.BIND_AUTO_CREATE);
        mService.refreshPlayers(); // Null Pointer Exception as mService is null
        pBar.setVisibility(View.VISIBLE);
        return true;
4

2 に答える 2

0

あなたNullPointerExceptionmService変数にあります。を呼び出すとbindService()、 は独自のスレッドにActivityバインドされます。Serviceこれは、サービスがバインドされている間もコードが実行され続けることを意味します。これにより、mService変数は引き続きnull.

できることは、Serviceがバインドされた後に実行する必要があるコードを、 のonServiceConnected()メソッドに移動することmConnectionです。mServiceこれにより、変数がサービスを指し、null にならないことが保証されます。

于 2013-01-03T14:27:42.977 に答える