2013-01-02 25 views
8

我試圖從一個片段綁定一個服務,就像我在一個活動中成功完成一樣,但是當我嘗試調用服務上的方法時,我得到一個NullPointerException - 很明顯,因爲服務是空的。現在有沒有在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

wwhat在mConnection中?另外,發佈堆棧跟蹤 – njzk2

+0

服務綁定綁定到上下文,所以應該可以工作。你應該展示更多的代碼,因爲我懷疑問題在別處。 – jsmith

+0

@jsmith我很樂意展示更多的代碼,但我需要具體知道爲什麼服務將爲空。我編輯了我的原始問題以包含棧跟蹤 – CodePrimate

回答

13

我解決了這個問題。事實證明,我忘記了在我的清單中提供正確的包名稱的服務聲明。

通過改變

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

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

我解決了這個問題,並預期該服務現在連接。

+0

我也忘了。爲我工作以及謝謝..... !!!! –

0

您的NullPointerException位於mService變量上。當您撥打bindService()時,Activity會在其自己的線索上綁定到Service。這意味着您的代碼將在服務綁定時繼續運行。這會導致您的mService變量仍爲null

你可以做的是將Service綁定後必須運行的代碼移動到mConnectiononServiceConnected()方法。這將確保mService變量將指向您的服務,並且不會爲空。

+0

我按照你所說的做了,但看起來服務永遠不會成功連接,因爲onServiceConnected永遠不會被調用。 – CodePrimate

+0

你仍然應該這樣做,因爲如果你的'(mBound)'變量可以是'false',那麼你仍然會得到'nullpointer',因爲'Service'的綁定需要比你想象的更多的時間,因爲它一個異步調用,你對mService.refreshPlayers()的後續調用將會產生一個空指針。 – tolgap

+0

你是對的,我調整了我的代碼,以便只有在mBound爲true的情況下才會調用refreshPlayers。 – CodePrimate

相關問題