2013-01-02 16 views
8

サービスでメソッドを呼び出しようとしたときと同じように、フラグメントからサービスをバインドしようとしていますが、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) 

そして、これは例外がスローされた正確な場所のようになります。 ケース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; 
+0

mConnectionには何がありますか?プラス、ポストスタックトレース – njzk2

+0

サービスのバインディングはContextに結びついているので、これはうまくいくはずです。私は他の場所に問題があると思うので、もっとコードを表示するべきです。 – jsmith

+0

@jsmith私は喜んでより多くのコードを表示したいと思いますが、なぜサービスがnullになるのかを具体的に知る必要があります。私は元の質問にstacktraceを含めるように編集しました – CodePrimate

答えて

13

私はこの問題を解決しました。私のマニフェストに正しいパッケージ名でサービス宣言を提供することを忘れてしまったことが分かります。

<service android:name="lite.hattrick.services.LiteTrickService" /> 

<service android:name=".LiteTrickService" /> 

を変更することにより、私は問題を解決し、予想されるようにサービスは、現在接続されています。

+0

私も忘れました。おかげさまで私のために働いた..... !!!! –

0

NullPointerExceptionmService変数にあります。 bindService()に電話すると、Activityは自分のスレッドのServiceにバインドされます。つまり、サービスがバインドされている間はコードは実行され続けます。これにより、の変数mServiceが引き続き表示されます。あなたは何ができるか

はあなたのmConnectiononServiceConnected()方法に、Serviceが結合した後に実行しなければならないコードを移動です​​。これにより、mService変数があなたのサービスを指し示し、nullにならないことが保証されます。

+0

あなたの言ったことはしましたが、onServiceConnectedが呼び出されないので、サービスが正常に接続されていないように見えます。 – CodePrimate

+0

あなたの '(mBound)'変数が 'false'になる可能性があるので、' Service 'のバインディングには思ったよりも時間がかかるので、 'nullpointer'が得られます。非同期呼び出しであれば、 'mService.refreshPlayers()'を呼び出すとnullpointerが返されます。 – tolgap

+0

あなたは正しいですし、mBoundがtrueの場合にのみrefreshPlayersが呼び出されるようにコードを調整しました。 – CodePrimate

関連する問題