2010-05-11 4 views
2

Ceci est mon code:lient service à une activité

public class MainActivity extends Activity { 
    private ComponentName mService; 
    private Servicio serviceBinder; 

    private ServiceConnection mConnection = new ServiceConnection() { 
      public void onServiceConnected(ComponentName className, IBinder service) { 
      serviceBinder = ((Servicio.MyBinder)service).getService(); 
      } 

      public void onServiceDisconnected(ComponentName className) { 
      serviceBinder = null; 
      } 
     }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Intent bindIntent = new Intent(this, Servicio.class); 
     bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE); 
    } 

    @Override 
    protected void onStart() { 
     serviceBinder.somethingThatTakesTooMuch(); 
     super.onStart(); 
    } 



public class Servicio extends Service { 
    private final IBinder binder = new MyBinder(); 

    @Override 
      public IBinder onBind(Intent intent) { 
    return binder; 
    } 

    public int somethingThatTakesTooMuch() { 
     return 1; 
    } 

    public class MyBinder extends Binder { 
      Servicio getService() { 
      return Servicio.this; 
      } 
    } 

Quand je lance, Obtenir un NullPointerException dans cette ligne:

serviceBinder.somethingThatTakesTooMuch(); 

Répondre

5

Votre onStart est appelé avant la connexion le service est complet. Ce n'est pas instantané.

Vous pouvez uniquement garantir que le service est connecté APRES l'appel de votre onServiceConnected. Alors seulement, vous pouvez appeler des méthodes sur serviceBinder.

Essayez d'appeler serviceBinder.somethingThatTakesTooMuch() sur la ligne après serviceBinder = ((Servicio.MyBinder)service).getService();

+1

synic: Oh, comment voulez-vous que je devrais gérer que je ne peux pas montrer mon activité jusqu'à ce que je la connexion? – Macarse

+0

Bonne question. Je ne sais pas. Vous pourriez probablement minimiser le temps qu'il faut en le créant au préalable (éventuellement dans une autre activité) – synic

+1

La connexion devrait être très rapide, mais elle n'est ni immédiate ni bloquante. Par conséquent, je ne m'inquiéterais pas de l'heure - il suffit d'écrire votre code qui a besoin du service pour qu'il soit déclenché par 'onServiceConnected()'. – CommonsWare

Questions connexes