Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Android:如何正确使用Gotox/socket.io-java-client库?_Android_Multithreading_Sockets_Gottox_Socket.io Java Client - Fatal编程技术网

Android:如何正确使用Gotox/socket.io-java-client库?

Android:如何正确使用Gotox/socket.io-java-client库?,android,multithreading,sockets,gottox,socket.io-java-client,Android,Multithreading,Sockets,Gottox,Socket.io Java Client,我有服务。我创建了一个线程,用于在此服务中在单独的线程上使用socket.io java客户端库 我用以下方法保持线程: @Override public void run() { while (canLiveThread) { // keep thread } } 这条路完全错了,是吗?要解决此问题,我需要找到以下问题的答案: 1。是否需要我单独创建线程以在服务中使用socket.io-java-client库?或者我可以不用线程就使用这个库,只需在服务中实现soc

我有服务。我创建了一个
线程
,用于在此服务中在单独的线程上使用
socket.io java客户端

我用以下方法保持线程:

@Override
public void run() {
    while (canLiveThread) {
    //  keep thread
    }
}
这条路完全错了,是吗?要解决此问题,我需要找到以下问题的答案:

1。是否需要我单独创建线程以在服务中使用socket.io-java-client库?或者我可以不用线程就使用这个库,只需在服务中实现socket.io-java-client库

2.如果需要创建线程来使用此库,那么如何以正确的方式管理线程,以避免在后台服务中耗尽电池

如果有人有任何解决办法,请回答这个问题


提前谢谢

事实上,我不知道如何使用
socket io客户端
正确,但我尽量说清楚。 据我所知,socket io客户端已在使用后台线程连接、发送和接收事件

第一条路

我认为这不是你想要的,但我尽可能展示这个变体。 首先,我创建了一个
SocketClient
,如下所示:

public class SocketClient implements IOCallback {

    private SocketIO socket;
    private Context context; // for some cases (i.e. broadcasting via LocalBroadcastManager).

    public SocketClient(Context context) {
       this.context = context;
    }

    public synchronized void connect() {
        if (socket == null || !socket.isConnected()) {
            Properties properties = new Properties();
            // setting your properties...
            try {
                socket = new SocketIO("http://your.address", properties);
                socket.connect(this);
            } catch (MalformedURLException e) {
                Log.e("SocketClientException", e.getMessage());
            }
        }
    }

    @Override
    public void onDisconnect() {

    }

    @Override
    public void onConnect() {

    }

    @Override
    public void onMessage(String data, IOAcknowledge ack) {

    }

    @Override
    public void onMessage(JsonElement json, IOAcknowledge ack) {

    }

    @Override
    public void on(String event, IOAcknowledge ack, JsonElement... args) {
        LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("action_on"));
    }

    @Override
    public void onError(SocketIOException socketIOException) {

    }

}
然后我创建了一个保存我们的
SocketClient
单例

public class API {

    private static API instance;
    private SocketClient client;

    private API() {
    }

    public static API getInstance() {
        if (instance == null) {
            instance = new API();
        }
        return instance;
    }

    public void init(Context context) {
        client = new SocketClient(context);
    }

    public SocketClient getSocketIO() {
        return client;
    }
}
然后在
Service
onCreate()
方法中,我只是调用我的singleton:

@Override
public void onCreate() {
    super.onCreate();
    Log.i("SocketService", "onCreate");
    API.getInstance().init(getApplicationContext());
    API.getSocketIO().connect();
}
此后,只要有
服务
,套接字就会一直处于活动状态,因此我们将能够在后台通过我们的单例从应用程序中的任何位置接收、发送套接字命令。我们可以通过
LocalBroadcastManager
on
onMessage
方法在
SocketClient
中发送接收到的数据

第二种方式

让我们尝试实现一个
SocketService

public class SocketService extends Service implements IOCallback {
    private SocketIO socket;

    private synchronized void connect() {
        if (socket == null || !socket.isConnected()) {
            Properties properties = new Properties();
            // setting your properties...
            try {
                socket = new SocketIO("http://your.address", properties);
                socket.connect(this);
            } catch (MalformedURLException e) {
                Log.e("SocketClientException", e.getMessage());
            }
        }
    }

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

    @Override
    public void onDisconnect() {

    }

    @Override
    public void onConnect() {

    }

    @Override
    public void onMessage(String data, IOAcknowledge ack) {

    }

    @Override
    public void onMessage(JsonElement json, IOAcknowledge ack) {

    }

    @Override
    public void on(String event, IOAcknowledge ack, JsonElement... args) {
         LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("action_on"));
    }

    @Override
    public void onError(SocketIOException socketIOException) {

    }
}
就这些。您可以从活动启动服务,并通过广播或消息处理程序进行通信。我从来没有尝试过第二种方法,但我认为它应该像一个魅力

结论


这些方法中没有一个单独使用后台线程,这对我来说很有效,我有三个基于第一种方法的应用程序,它们都在后台工作,没有任何支持。希望答案对所有对SocketIO感兴趣的人都有帮助(用法:)

谢谢你的回答,但是我有一个问题,你的服务运行在主线程中是吗?我不明白你为什么不为socket.io创建单独的线程?也许我错了,但正如你在下面的链接中看到的,有一个单独的线程可以与服务器握手和连接。当您调用
SocketIO socket=newsocketio(url,properties)
时,该线程就会启动,因此我认为我们不需要再创建一个单独的线程来启动它内部的
ConnectThread
。我认为这是多余的。林克:沃夫,是的,你绝对正确!,但我看到了示例gotox/socket.io,它们为使用socket io库创建单独的线程:。你对此有何看法?你对此有何看法?老实说,我不知道他为什么要使用一个单独的线程来“启动另一个单独的线程”:)我只是认为这是因为他在使用标准java套接字时有使用单独线程的习惯。我认为使用线程来启动线程是多余的。根据我的经验,当我使用socket io时,它已经在单独的线程中工作了,所以我从未有过“冻结UI”的效果。无论如何,你可以在Github上询问Gotox,他为什么使用另一个单独的线程。我正在使用库来模拟Gotox,它甚至可以与nodejs 1.x.x一起工作。而且不需要创建单独的线程,只需要一个使套接字保持活动状态的服务。@Kush Sharma我可以将这个库与socket.io 0.9.18一起使用吗?