Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android WebSocket服务建立多个连接_Java_Android_Performance_Apache_Websocket - Fatal编程技术网

Java Android WebSocket服务建立多个连接

Java Android WebSocket服务建立多个连接,java,android,performance,apache,websocket,Java,Android,Performance,Apache,Websocket,我已经创建了一个Web套接字服务。但它一直在进行多重连接 我只希望应用程序建立一个连接,除非网络连接断开,然后再建立另一个连接。 但现在,如果我按下手机上的home(主页)按钮,它会建立一个连接。然后返回应用程序,它将建立另一个连接 谢谢你们的帮助 创建我的主要活动的… Intent startServiceIntent = new Intent(this, WebSocketServices.class); startService(startServiceIntent);

我已经创建了一个Web套接字服务。但它一直在进行多重连接

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

谢谢你们的帮助

创建我的主要活动的…

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>
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

尝试在onReceive方法中过滤操作-类似
if(“android.intent.action.BOOT_COMPLETED”).equals(intent.getAction())
之所以发生这种情况,是因为在您返回应用程序后,onCreate将再次被调用,并与套接字建立另一个连接。 因此,如果您的IntentService仍在运行,您可以简单地不启动另一个服务,如下所示:

一旦创建。。。主要活动的类型

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;
}
private boolean IsMyService正在运行(类serviceClass){
ActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_服务);
for(RunningServiceInfo服务:manager.getRunningServices(Integer.MAX_值)){
if(serviceClass.getName().equals(service.service.getClassName())){
返回true;
}
}
返回false;
}

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

MrT,我也有类似的问题

不要使用intentService。只要使用服务。因为一旦完成了intentService,它将自行完成

更改为服务后,您可以使用布尔值检查您的服务是否已按如下方式启动:

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;
            }
        }
....
也就是说,这项服务只会启动一次。直到你手动杀死它


这对我很有效,试着让我知道。

谢谢,这很有效。非常非常非常感谢。感谢所有其他给我反馈的人
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;
            }
        }
....