【问题标题】:Android WebSocket Services making multiple connections建立多个连接的 Android WebSocket 服务
【发布时间】:2015-05-19 08:59:43
【问题描述】:

我创建了一个 Web Socket 服务。但它一直在建立多个连接

我只想让应用建立一个连接,除非网络连接断开然后再建立另一个。 但是现在,如果我按下手机上的主页按钮,它就会建立一个连接。然后返回应用程序,它将建立另一个连接。

感谢你们的帮助。

onCreate... 我的 MainActivity

Intent startServiceIntent = new Intent(this, WebSocketServices.class);
        startService(startServiceIntent);

清单

<!-- WebSocket -->
<receiver 
    android:name="com.example.basicplayerapp.core.NetworkReceiver">
   <intent-filter >
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
       <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter> 
</receiver>
<service android:name="com.example.basicplayerapp.core.WebSocketServices"></service>

网络接收器

public class NetworkReceiver extends BroadcastReceiver {
    public static final String TAG = HomeActivity.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {         
        ConnectivityManager conn =  (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = conn.getActiveNetworkInfo();

        if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) {
            Log.i(TAG, "connected");

            Intent startServiceIntent = new Intent(context, WebSocketServices.class);
            context.startService(startServiceIntent);

        } 
        else if(networkInfo != null){
            NetworkInfo.DetailedState state = networkInfo.getDetailedState();
            Log.i(TAG, state.name());
        }
        else {
            Log.i(TAG, "lost connection");

        }


    }//end onReceive    
};//end NetworkReceiver

WebsocketServices

public class WebSocketServices extends IntentService {
    public static final String TAG = WebSocketServices.class.getSimpleName();

    private static  String SOCKET_ADDR = "http://171.0.0.1:8080";
    private String message = null;
    private WebSocket socket = null;

    public WebSocketServices() {
        super("DownloadService");
    }


    @Override
    protected void onHandleIntent(Intent intent) {
        Log.i(TAG, "onHandleIntent");

        //SOCKET_ADDR = intent.getStringExtra("ip");

        if(socket==null || !socket.isOpen() || socket.isPaused())
        connectToPASocket(SOCKET_ADDR);

        Log.d(TAG,"Service Invoke Function");
    }//end onHandleIntent






    //=====================================================================================
    // Socket connection 
    //===================================================================================== 
    private void connectToPASocket(String SOCKET_ADDR) {
        Log.i(TAG, "connectToPASocket()");

        // Checking
        if (socket != null && socket.isOpen()) return;


        // Initiate web socket connection
        AsyncHttpClient.getDefaultInstance().websocket(SOCKET_ADDR, null,
                new AsyncHttpClient.WebSocketConnectCallback() {
                    @Override
                    public void onCompleted(Exception ex, WebSocket webSocket) {
                        Log.i(TAG, "onCompleted");

                        if (ex != null) {
                            Log.i(TAG, "onCompleted > if (ex != null)");
                            ex.printStackTrace();
                            return;
                        }

                        socket = webSocket;
                        socket.setStringCallback(new StringCallback() {
                            public void onStringAvailable(String s) {
                                Log.i(TAG, "socket.setStringCallback > onStringAvailable - s => " + s);

                                System.out.println("I got a string: " + s);
                                message = s;



                            }// end onStringAvailable
                        });// end socket.setStringCallback

                        socket.setDataCallback(new DataCallback() { // Find out what this does
                            @Override
                            public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
                                Log.i(TAG, "socket.setDataCallback > onDataAvailable | emitter=> " + emitter + " | bb => " + bb);

                                System.out.println("I got some bytes!");
                                // note that this data has been read
                                bb.recycle();
                            }
                        });// end webSocket.setDataCallback

                    }// end onCompleted
                });// end AsyncHttpClient.getDefaultInstance()
    }// end connectToPASocket
}//end WebSocketServices

【问题讨论】:

    标签: java android performance apache websocket


    【解决方案1】:

    先生,我也有类似的问题。

    不要使用意图服务。只需使用服务。因为一旦 intentService 完成,它就会自行完成。

    你改成Service后,你可以做的就是用boolean来检查你的服务是否已经启动,如下:

    boolean isSockeStarted = false;
    
    
    
      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
    ...
    
    
            if (socket == null || !socket.isOpen() || socket.isPaused()) {
    
                if (isSockeStarted) { //not started
                } else {
                    isSockeStarted = true;
                }
            }
    ....
    

    也就是说,这个服务只会启动一次。直到你手动杀死它。

    它对我有用,请尝试告诉我。

    【讨论】:

    • 感谢这项工作。真的非常感谢。并感谢所有其他也给我反馈的人
    【解决方案2】:

    尝试在 onReceive 方法中过滤操作 - 类似于 if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction()))

    【讨论】:

      【解决方案3】:

      发生这种情况是因为在您返回应用程序后 onCreate 将被第二次调用,并与 socket 建立另一个连接。 因此,如果您的 IntentService 仍在运行,您可以简单地不要启动另一个服务,如下所示:

      onCreate... of MainActivity

      if(isMyServiceRunning(WebSocketServices.class)){
      Intent startServiceIntent = new Intent(this, WebSocketServices.class);
          startService(startServiceIntent);
      }
      

      查看您的服务是否正在运行的方法

      private boolean isMyServiceRunning(Class<?> serviceClass) {
      ActivityManager manager = (ActivityManager)    getSystemService(Context.ACTIVITY_SERVICE);
      for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
          if (serviceClass.getName().equals(service.service.getClassName())) {
              return true;
          }
      }
      return false;
      }
      

      【讨论】:

        【解决方案4】:

        您应该使用常规服务,而不是意图服务。一旦意图服务完成,它就完成了。服务可以启动一个后台线程,该线程将维持 Web 套接字连接,直到您明确终止它;或者操作系统回收服务的内存(您需要在其中重新启动它)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-17
          • 2021-01-02
          • 1970-01-01
          • 2020-04-25
          • 1970-01-01
          • 2015-06-11
          • 2012-09-09
          • 1970-01-01
          相关资源
          最近更新 更多