2010-12-16 122 views
0

Lorsque mon activité est démarrée, elle crée un service qui agit en tant que serveur. Le serveur reçoit des données brutes de mon script python sur mon bureau. Le Service crée et maintient des DataManagers qui gèrent toutes les données de mon script python dans une carte de hachage indexée sur le nom du DM. À tout moment, j'ai besoin d'une activité pour lier à la demande de service certaines données du service et du processus, lorsque l'activité s'arrête, s'arrête ou est détruite, elle se déconnectera. Je crois que j'ai la liaison correcte, mais quand je démarre le service le ServiceConnection passé est toujours retourné nul. Avez-vous une idée de ce qui passe? mon code a été volé directement de la classe RemoteService d'Android Merci ~ AedonConnexion du service Android?

{additif code}

L'activité HomeScreen qui se lie au PublicService

@Override public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    doBindService(); 
    setContentView(R.layout.homescreen); 
    initView(); 
} 

public void initView() { 
    workbenchs = (Gallery)findViewById(R.id.workbenchs); 
    workbenchs.setMinimumHeight(h/4); 
    workbenchs.setAdapter(new WorkBenchAdapter(this)); 
    workbenchs.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
      Intent it = new Intent(HomeScreen.this, Controller.class); 
      it.putExtra("workbench", arg2); 
      startActivity(it); 
     } 
    }); 
} 

// Gallery Adapter 

public class WorkBenchAdapter extends BaseAdapter { 
    public WorkBenchAdapter(Context c) { } 
    public int getCount() {return mBoundService.getNumBenchs();} 
    public Object getItem(int position) {return position;} 
    public long getItemId(int position) {return position;} 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView i = new ImageView(HomeScreen.this); 
    i.setImageBitmap(mBoundService.getWorkbench(position).toBitmap()); 
     i.setLayoutParams(new Gallery.LayoutParams(w/4, h/4)); 
     return i; 
    } 
} 


// Service Necessities 

public boolean mIsBound = false; 
private PublicService mBoundService; 
private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     mBoundService = ((PublicService.LocalBinder)service).getService(); 
    } 

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

void doBindService() { 
    Log.d(TAG, "Binding..."); 
    bindService(new Intent(this, PublicService.class), mConnection, Context.BIND_AUTO_CREATE); 
    mIsBound = true; 
    Log.d(TAG, "Bound."); 
} 

void doUnbindService() { 
    if (mIsBound) { 
     Log.d(TAG, "Unbinding..."); 
     unbindService(mConnection); 
     mIsBound = false; 
     Log.d(TAG, "Unbound."); 
    } 
} 

Mon problème vient de l'adaptateur Workbench . Lorsque l'adaptateur est créé, il appelle get count (qui commence par 0), mais il continue à dire que mBoundService est null. J'ai essayé de démarrer le service avant la liaison et cela ne change rien ...

+0

Pouvez-vous poster le code concernant ce sujet? – xandy

+0

Désolé pour le bordel, la fichue chose refuse de bloquer ce que je lui ai donné. par exemple les/** */commentaires sont supposés être de longues lignes de ***** – AedonEtLIRA

+0

Pour apprendre à écrire du code, lisez ceci: http://stackoverflow.com/editing-help – Cristian

Répondre

2

Avez-vous spécifié le numéro de service dans votre manifeste?

En <application> vous devez spécifier le service comme celui-ci <service android:name="namespace.ServiceName"/>

+0

Oui. Je pense que ce qui se passe est que pendant que je lie le service bien avant que je déclare initView(), la création du service n'est pas terminée au moment où initView() est appelé et essaie donc d'appeler un service nul. – AedonEtLIRA

+0

Merci pour ça. Résolu mon problème aussi. – CeejeeB