原文链接地址:http://socket.io/blog/native-socket-io-and-android/
在本教程中我们将学习如何创建一个聊天客户端用socket . ioNode. JS做为聊天服务器,我们的 nativate安卓客户端! 如果你想直接跳转到代码,它在GitHub。 否则,继续读下去!
跟随,首先克隆存储库:socket.io-android-chat。
应用程序具有以下特点:
Socket.IO提供了一个面向事件的API,可以在所有网络、设备和浏览器。 非常健壮的(甚至作品背后的公司代理!)和高性能,这是非常适合多人游戏或实时通信。
第一步是安装Java Socket。 输入输出端与Gradle。
对于这个应用程序,我们将依赖项添加到build.gradle
:
// app/build.gradle
dependencies {
...
compile 'com.github.nkzawa:socket.io-client:0.3.0'
}
我们必须记住添加网络许可AndroidManifest.xml
。
...
现在我们可以在android上使用socket.IO!
首先,我们必须初始化Socket.io 的一个新实例。如下:
import com.github.nkzawa.socketio.client.IO;
import com.github.nkzawa.socketio.client.Socket;
private Socket mSocket;
{
try {
mSocket = IO.socket("http://chat.socket.io");
} catch (URISyntaxException e) {}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSocket.connect();
}
IO.socket()
返回Sockethttp://chat.socket.io
使用默认选项。 注意,方法缓存结果,所以你可以得到一个相同的 Scocket从任何Activity或Fragment实例的url。
我们显式调用connect()
在这里建立连接(与JavaScript客户端)。 在这个程序中,我们使用onCreate
生命周期回调,但它实际上取决于您的应用程序。
发送数据看起来如下。 在这种情况下,我们发送一个字符串,但你也可以做JSON数据org.json包,甚至还支持二进制数据!
private EditText mInputMessageView;
private void attemptSend() {
String message = mInputMessageView.getText().toString().trim();
if (TextUtils.isEmpty(message)) {
return;
}
mInputMessageView.setText("");
mSocket.emit("new message", message);
}
就像我前面提到的,Socket.IO 是双向的,这意味着我们可以向服务器发送事件,但也随时在通信服务器可以发送事件。
然后我们可以Socket监听事件onCreate
生命周期回调。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSocket.on("new message", onNewMessage);
mSocket.connect();
}
我们监听 new message事件从其他用户接收消息。
import com.github.nkzawa.emitter.Emitter;
private Emitter.Listener onNewMessage = new Emitter.Listener() {
@Override
public void call(final Object.. args) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
JSONObject data = (JSONObject) args[0];
String username;
String message;
try {
username = data.getString("username");
message = data.getString("message");
} catch (JSONException e) {
return;
}
// add the message to view
addMessage(username, message);
}
});
}
};
这就是onNewMessage
的样子。 一个侦听器的一个实例Emitter.Listener
,必须实施call
方法。 你会注意到里面的call()
包装的 Activity# runOnUiThread()
,这是因为回调总是另一个线程从Android UI线程里面调用,因此我们必须确保将消息添加到UI线程的视图上。
因为一个Android活动有自己的生命周期,我们也应该仔细管理套接字的状态,以避免内存泄漏等问题。 在这个程序中,我们将关闭套接字连接,删除所有的听众onDestroy
回调的活动。
@Override
public void onDestroy() {
super.onDestroy();
mSocket.disconnect();
mSocket.off("new message", onNewMessage);
}
调用 off()
删除new message()的侦听器事件。