2010-05-15 4 views
6

Я получаю исключение исключающего указателя в строке mService.start() при попытке привязки к уже запущенной службе. Я делаю то же самое из разных видов деятельности (где начинается сервис), все идет правильно. Все эти действия являются частью одного приложения.android bindservice

Как вы думаете, что я делаю неправильно?

public class RouteOnMap extends MapActivity{ 
    private static final int NEW_LOCATION = 1; 
    private static final int GPS_OFF = 2; 

    private MapView mMapView; 
    private ILocService mService; 
    private boolean mServiceStarted; 
    private boolean mBound; 
    private Intent mServiceIntent; 
    private double mLatitude, mLongitude; 

    private ServiceConnection connection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder iservice) { 
      mService = ILocService.Stub.asInterface(iservice); 
      mBound = true; 
     } 

     public void onServiceDisconnected(ComponentName className) { 
      mService = null; 
      mBound = false; 
     } 

    }; 

    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mapview); 

     mMapView = (MapView) findViewById(R.id.mapview); 
     mMapView.setBuiltInZoomControls(true);  
     mServiceIntent = new Intent(); 
     mLatitude = 0.0; 
     mLongitude = 0.0; 
     mBound = false; 
    } 

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

     mServiceIntent.setClass(this, LocationService.class); 
     //startService(mServiceIntent); 
     if(!mBound){ 
      mBound = true; 
      this.bindService(mServiceIntent, connection, Context.BIND_AUTO_CREATE); 
     } 
    } 

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


     try { 
      mService.start(); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 

    } 

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

     if(mBound){ 
      this.unbindService(connection); 
     } 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

} 

ответ

8

У вас нет возможности узнать, если услуга связана onResume(). bindService() не является блокирующим вызовом. Позвоните по телефону mService.start() с вашего метода onServiceConnected().

+0

спасибо. Сработало обращение к mService.start() из onServiceConnected. Вы рекомендуете всегда вызывать методы mService из onServiceConnected()? – mnish

+3

Пока не вызывается 'onServiceConnected()', 'mService' является' null'. Следовательно, вы не хотите вызывать методы в 'mService', пока не будете уверены, что' onServiceConnected() 'будет вызван. Например, к моменту, когда пользователь может щелкнуть что-то, 'mService', вероятно, готов. Однако 'onResume()' слишком скоро - ваш запрос 'bindService()', возможно, еще не обработан. – CommonsWare

+0

большое спасибо за вашу помощь – mnish

Смежные вопросы