2017-07-12 2 views
0

J'essaie d'accéder à une connexion socket de ma classe de service dans ma classe d'activité et emit ting données à mon serveur en ligne.Accès à une connexion socket à partir d'une classe de service dans une activité

MyService.java 

    public class MyService extends Service { 

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

     @Override 
     public void onCreate() { 
      this.isRunning = false; 
      this.backgroundThread = new Thread(myTask); 
     } 

     private Runnable myTask = new Runnable() { 
      @Override 
      public void run() { 


       try { 
        // instantiate socket connection 
        mSocket = IO.socket(AppConstants.CHAT_SERVER_URL); 

        // establish the socket connection 
        mSocket.connect(); 

       } catch (URISyntaxException e) { 
        throw new RuntimeException(e); 
       } 
      } 
     }; 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      if(!this.isRunning) { 
       this.isRunning = true; 
       this.backgroundThread.start(); 
      } 

      return START_STICKY; 
     } 

     public Socket getSocket() { 
      return mSocket; 
     } 
    } 



    MyApplication.java 

    public class MyApplication extends Application { 

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

      Intent background = new Intent(this, MyService.class); 
      startService(background); 
     } 
    } 


    MainActivity.java 

    public class MainActivity extends Activity { 


     Socket mSocket; 
     MyService mservice; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      mSocket = mservice.getSocket(); 

     } 

     public void sendMessage(View view){ 
      mSocket.emit("new messaged", "this"); 
     } 

    } 

Le ci-dessus donne une erreur nulle, lorsque la méthode sendMessage dans le MainActivity est déclenchée, même si la connexion est établie au démarrage.

Je sais très bien que, je peux bind connexion et utiliser la classe ServiceConnection dans la classe d'activité pour accéder à la connexion mSocket, mais je suis d'utiliser cette manière ou d'une broadcast receiver pour y accéder. Toutes les idées sur le meilleur pour accéder à la connexion de socket sans limite de classe de service à la classe d'activité.

Répondre

0

Vous devriez obtenir une NullPointerException sur ce point:

mSocket = mservice.getSocket(); 

parce que vous n'attribuez mservice à quoi que ce soit!

+0

Je viens d'accéder à la méthode 'getSocket()' de la classe Service, et dans cette classe il a déjà été défini, de toute façon pouvez-vous suggérer un meilleur moyen pour cela – George

+0

vous devez d'abord régler 'mservice' sur quelque chose avant de pouvoir appeler 'getSocket()' dessus! –