2016-07-16 2 views
0

in meiner Anwendung kann ich nicht erstellen einfachen einzelnen Dienst zu Socket verbinden, in meiner Anwendung nach dem ersten Ausführen der Anwendung kann ich eine Anfrage ausstellen, aber nach der nahen Anwendung und erneut ausführen, meine App senden zweimal Anfrage an socket.io, und nach dem Löschen der App von der letzten Anwendung, die mehrere Anfragen an socket.io senden. Bitte helfen Sie mir einzigen Dienst zu schaffen eine Verbindung zu schaffen, dankAndroid create single dienstinstanz für Socket.io

Mein Service:

public class SignalChatServiceProvider extends Service { 
    public static  SignalChatServiceProvider instance     = null; 

    public static boolean isInstanceCreated() { 
     return instance == null ? false : true; 
    } 

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

    private final IBinder myBinder = new LocalBinder(); 

    public class LocalBinder extends Binder { 
     public SignalChatServiceProvider getService() { 
      return SignalChatServiceProvider.this; 
     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     realm = Realm.getDefaultInstance(); 
     signalApplication = (SignalApplication) getApplication(); 
     EventBus.getDefault().register(this); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
     connectConnection(); 
     Log.e("EJRA...", ""); 
     return START_STICKY; 
    } 


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

     } 
    }; 

    private void connectConnection() { 

     instance = this; 
     signalApplication.CHAT_SOCKET = signalApplication.getSocket(); 
     signalApplication.getSocket().on(Socket.EVENT_CONNECT_ERROR, onConnectError); 
     signalApplication.getSocket().on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError); 
     signalApplication.getSocket().on(Socket.EVENT_CONNECT, onConnect); 

     signalApplication.getSocket().on("new message", onNewMessage); 
     signalApplication.getSocket().on("user joined", onUserJoined); 
     signalApplication.getSocket().on("getProductImages", getProductImages); 

     signalApplication.getSocket().connect(); 
    } 

    private void disconnectConnection() { 
     instance = null; 

     signalApplication.getSocket().disconnect(); 

     signalApplication.getSocket().off(Socket.EVENT_CONNECT, onConnect); 
     signalApplication.getSocket().off(Socket.EVENT_DISCONNECT, onDisconnect); 
     signalApplication.getSocket().off(Socket.EVENT_CONNECT_ERROR, onConnectError); 
     signalApplication.getSocket().off(Socket.EVENT_CONNECT_TIMEOUT, onConnectError); 
     signalApplication.getSocket().off("new message", onNewMessage); 
     signalApplication.getSocket().off("user joined", onUserJoined); 
     signalApplication.getSocket().off("getProductImages", getProductImages); 

     signalApplication.getSocket().disconnect(); 
    } 

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

     disconnectConnection(); 

     if (!realm.isClosed()) 
      realm.close(); 
    } 
} 

ActivityMain:

if (signalApplication.getSocket() != null && !SignalChatServiceProvider.isInstanceCreated()) { 
    startService(new Intent(getBaseContext(), SignalChatServiceProvider.class)); 
} 

Anwendungsklasse:

public class SignalApplication extends Application { 

    public static List<MarketsBaseInformation> market_list_cache_data; 
    public static Socket      CHAT_SOCKET; 

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

     resources = this.getResources(); 
     context = getApplicationContext(); 

     IO.Options opts = new IO.Options(); 
     opts.forceNew = true; 
     opts.reconnection = true; 

     try { 
      CHAT_SOCKET = IO.socket(ClientSettings.getChatAddress(), opts); 
     } catch (URISyntaxException e) { 
      e.printStackTrace(); 
      Log.e("SOCKET.IO ", e.getMessage()); 
     } 


    } 

    public Socket getSocket() { 
     return CHAT_SOCKET; 
    } 
} 
+0

Hallo Tux-Welt, In Ihrem Service, können Sie ein Protokoll innerhalb der onCreate und onDestroy Methoden hinzufügen und wenn Sie diesen Zyklus des Startens durch/Ihre Anwendung zu stoppen, wie oft sehen Sie diese Protokolle erscheinen ? –

+0

@Henrik Gyllensvärd Hallo Herr, nach der klaren Anwendung von den letzten Anwendungen, mein Dienst neu erstellt, in der neuen Installation und Openning-Anwendung, senden Anfrage ist "einmal", nach der offenen Anwendung auf MainActivity Anfrage ist 'zweimal', warum? Ich bin müde :( –

+0

Ich versuche zu helfen, aber um eine klare und gute Antwort zu geben, fragte ich nach den Protokollen :) Sie können auch versuchen, dies in Ihrer MainActivity überschreiben Sie die onDestroy-Methode so und fügen Sie Folgendes hinzu: stopService (neue Absicht (diese, SignalChatServiceProvider.class)); Wenn dies hilft, sollten wir Ihren Code ein wenig umstrukturieren, um zu verbessern, wie dies getan wird. :) –

Antwort

0

Problem gelöst

public class SignalChatServiceProvider extends Service { 
    public static  SignalChatServiceProvider instance   = null; 
    public static final String     GET_COMMANDS  = "onGetCommands"; 
    public static final String     NEW_REGISTRATION = "onNewRegistration"; 

    private SignalApplication signalApplication; 
    private Realm    realm; 
    private String   marketUUid; 

    public static boolean isInstanceCreated() { 
     return instance == null ? false : true; 
    } 

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

    private final IBinder myBinder = new LocalBinder(); 

    public class LocalBinder extends Binder { 
     public SignalChatServiceProvider getService() { 
      return SignalChatServiceProvider.this; 
     } 
    } 

    public void IsBendable() { 
     //Toast.makeText(this, "I bind like butter", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onCreate() { 
     //@formatter:on 
     if (isInstanceCreated()) { 
      return; 
     } 
     super.onCreate(); 
     realm = Realm.getDefaultInstance(); 

     signalApplication = (SignalApplication) getApplication(); 

     if (signalApplication.getSocket() == null) 
      signalApplication.CHAT_SOCKET = signalApplication.getSocket(); 

     signalApplication.getSocket().on(Socket.EVENT_CONNECT_ERROR, onConnectError); 
     signalApplication.getSocket().on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError); 
     signalApplication.getSocket().on(Socket.EVENT_CONNECT, onConnect); 

     //@formatter:off 
      signalApplication.getSocket().on("get commands"  , onGetCommands); 
      signalApplication.getSocket().on("getMarketBanners" , getMarketBanners); 
      signalApplication.getSocket().on("getMarketProducts" , getMarketProducts); 
      signalApplication.getSocket().on("getProductImages" , getProductImages); 
     //@formatter:on 

     EventBus.getDefault().register(this); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
     connectConnection(); 
     return START_STICKY; 
    } 

    private Emitter.Listener onConnect = new Emitter.Listener() { 
     @Override 
     public void call(Object... args) { 
      new Handler(Looper.getMainLooper()).post(new Runnable() { 
       @Override 
       public void run() { 
        EventBus.getDefault().post(
          new SignalChangeChatServerStateEvent(SignalChangeChatServerStateEvent.chatServerState.connected) 
        ); 
       } 
      }); 
     } 
    }; 

    private Emitter.Listener onDisconnect = new Emitter.Listener() { 
     @Override 
     public void call(Object... args) { 
      new Handler(Looper.getMainLooper()).post(new Runnable() { 
       @Override 
       public void run() { 
        EventBus.getDefault().post(
          new SignalChangeChatServerStateEvent(SignalChangeChatServerStateEvent.chatServerState.disconnected) 
        ); 
       } 
      }); 
     } 
    }; 

    private Emitter.Listener onConnectError = new Emitter.Listener() { 
     @Override 
     public void call(Object... args) { 
      new Handler(Looper.getMainLooper()).post(new Runnable() { 
       @Override 
       public void run() { 
        EventBus.getDefault().post(
          new SignalChangeChatServerStateEvent(SignalChangeChatServerStateEvent.chatServerState.flashConnectionIcon) 
        ); 
       } 
      }); 
     } 
    }; 

    private Emitter.Listener onGetCommands = new Emitter.Listener() { 
     @Override 
     public void call(final Object... args) { 
     } 
    }; 

private Emitter.Listener getMarketBanners = new Emitter.Listener() { 
     @Override 
     public void call(final Object... args) { 
     } 
    }; 

    private Emitter.Listener getProductImages = new Emitter.Listener() { 
     @Override 
     public void call(final Object... args) { 
     } 
    }; 

    private Emitter.Listener getMarketProducts = new Emitter.Listener() { 
     @Override 
     public void call(final Object... args) { 
     } 
    }; 

    private void connectConnection() { 
     instance = this; 
     signalApplication.getSocket().connect(); 
    } 

    private void disconnectConnection() { 
     instance = null; 
     signalApplication.getSocket().disconnect(); 
    } 

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

     if (!realm.isClosed()) 
      realm.close(); 

     signalApplication.getSocket().off(Socket.EVENT_CONNECT, onConnect); 
     signalApplication.getSocket().off(Socket.EVENT_DISCONNECT, onDisconnect); 
     signalApplication.getSocket().off(Socket.EVENT_CONNECT_ERROR, onConnectError); 
     signalApplication.getSocket().off(Socket.EVENT_CONNECT_TIMEOUT, onConnectError); 

     //@formatter:off 
      signalApplication.getSocket().off("get commands"  , onGetCommands); 
      signalApplication.getSocket().off("getMarketBanners" , getMarketBanners); 
      signalApplication.getSocket().off("getMarketProducts" , getMarketProducts); 
      signalApplication.getSocket().off("getProductImages" , getProductImages); 
     //@formatter:on 

     disconnectConnection(); 
    } 

    @Subscribe 
    public void onEvent(SignalChangeChatServerStateEvent event) { 
     switch (event.getState()) { 
      case connected: 
       connectConnection(); 
       break; 
      case disconnected: 
       disconnectConnection(); 
       break; 
     } 

    } 
} 
Verwandte Themen