
AndroidAsync文档翻译:读我,README.md
AndroidAsync
AndroidAsync是一个低级别的网络协议库。如果妳正在找一个易用的、高级别的、支持安卓的http请求库,那么,看看 Ion (它是以AndroidAsync 为基础开发的)。一般的安卓应用程序开发者应当对Ion 更感兴趣。
但是,如果妳想找的是一个用于安卓的原始 套接字 (Socket)、HTTP客户端/服务器、WebSocket和Socket.IO库,那么,AndroidAsync就是妳要找的东西了。
特性
基于NIO。单线程,使用回调函数来驱动。高效。
所有的操作都返回一个 未来 对象(Future),可用于取消请求
Socket客户端+ socket服务器
HTTP客户端+ 服务器
WebSocket客户端+ 服务器
Socket.IO客户端
下载
将某个统一资源定位符的内容下载为一个String
// url就是要下载的统一资源定位符。
AsyncHttpClient.getDefaultInstance().getString(url, new AsyncHttpClient.StringCallback() {
// 当发生异常、错误,或者收到结果时,会调用此回调函数。
@Override
public void onCompleted(Exception e, AsyncHttpResponse response, String result) {
if (e != null) {
e.printStackTrace();
return;
}
System.out.println("I got a string: " + result);
}
});
将某个统一资源定位符的内容下载为JSON
// url就是要下载的统一资源定位符。
AsyncHttpClient.getDefaultInstance().getJSONObject(url, new AsyncHttpClient.JSONObjectCallback() {
// 当发生异常、错误,或者收到结果时,会调用此回调函数。
@Override
public void onCompleted(Exception e, AsyncHttpResponse response, JSONObject result) {
if (e != null) {
e.printStackTrace();
return;
}
System.out.println("I got a JSONObject: " + result);
}
});
类似地,JSONArrays...
// url就是要下载的统一资源定位符。
AsyncHttpClient.getDefaultInstance().getJSONArray(url, new AsyncHttpClient.JSONArrayCallback() {
// 当发生异常、错误,或者收到结果时,会调用此回调函数。
@Override
public void onCompleted(Exception e, AsyncHttpResponse response, JSONArray result) {
if (e != null) {
e.printStackTrace();
return;
}
System.out.println("I got a JSONArray: " + result);
}
});
将某个统一资源定位符的内容下载为一个文件
AsyncHttpClient.getDefaultInstance().getFile(url, filename, new AsyncHttpClient.FileCallback() {
@Override
public void onCompleted(Exception e, AsyncHttpResponse response, File result) {
if (e != null) {
e.printStackTrace();
return;
}
System.out.println("my file is available at: " + result.getAbsolutePath());
}
});
当然,也支持缓存
// 参数分别是:http客户端对象实例、用于存储缓存文件的目录和以字节数表示的缓存大小
ResponseCacheMiddleware.addCache(AsyncHttpClient.getDefaultInstance(),
getFileStreamPath("asynccache"),
1024 * 1024 * 10);
还可以创建网页套接字(web sockets):
AsyncHttpClient.getDefaultInstance().websocket(get, "my-protocol", new WebSocketConnectCallback() {
@Override
public void onCompleted(Exception ex, WebSocket webSocket) {
if (ex != null) {
ex.printStackTrace();
return;
}
webSocket.send("a string");
webSocket.send(new byte[10]);
webSocket.setStringCallback(new StringCallback() {
public void onStringAvailable(String s) {
System.out.println("I got a string: " + s);
}
});
webSocket.setDataCallback(new DataCallback() {
public void onDataAvailable(ByteBufferList byteBufferList) {
System.out.println("I got some bytes!");
// 注意,这砣数据已经读取了
byteBufferList.recycle();
}
});
}
});
AndroidAsync还支持socket.io
SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), "http://192.168.1.2:3000", new ConnectCallback() {
@Override
public void onConnectCompleted(Exception ex, SocketIOClient client) {
if (ex != null) {
ex.printStackTrace();
return;
}
client.setStringCallback(new StringCallback() {
@Override
public void onString(String string) {
System.out.println(string);
}
});
client.on("someEvent", new EventCallback() {
@Override
public void onEvent(JSONArray argument, Acknowledge acknowledge) {
System.out.println("args: " + arguments.toString());
}
});
client.setJSONCallback(new JSONCallback() {
@Override
public void onJSON(JSONObject json) {
System.out.println("json: " + json.toString());
}
});
}
});
想做multipart/form-data形式的上传?也可以。
AsyncHttpPost post = new AsyncHttpPost("http://myservercom/postform.html");
MultipartFormDataBody body = new MultipartFormDataBody();
body.addFilePart("my-file", new File("/path/to/file.txt");
body.addStringPart("foo", "bar");
post.setBody(body);
AsyncHttpClient.getDefaultInstance().execute(post, new StringCallback() {
@Override
public void onCompleted(Exception e, AsyncHttpResponse source, String result) {
if (e != null) {
ex.printStackTrace();
return;
}
System.out.println("Server says: " + result);
}
});
还可以使用AndroidAsync 创建简单的HTTP 服务器:
AsyncHttpServer server = new AsyncHttpServer();
List<WebSocket> _sockets = new ArrayList<WebSocket>();
server.get("/", new HttpServerRequestCallback() {
@Override
public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {
response.send("Hello!!!");
}
});
// 监听端口5000
server.listen(5000);
// 使用浏览器访问http://localhost:5000 则会返回Hello!!!
还有WebSocket服务器:
server.websocket("/live", new WebSocketRequestCallback() {
@Override
public void onConnected(final WebSocket webSocket, RequestHeaders headers) {
_sockets.add(webSocket);
//使用这个回调函数来清除掉任何残存的对于妳的websocket的引用
websocket.setClosedCallback(new CompletedCallback() {
@Override
public void onCompleted(Exception ex) {
try {
if (ex != null)
Log.e("WebSocket", "Error");
} finally {
_sockets.remove(webSocket);
}
}
});
webSocket.setStringCallback(new StringCallback() {
@Override
public void onStringAvailable(String s) {
if ("Hello Server".equals(s))
webSocket.send("Welcome Client!");
}
});
}
});
//..过一段时间之后,发送广播!
for (WebSocket socket : _sockets)
socket.send("Fireball!");
未来(Futures)
所有的这些应用编程接口都会返回 未来对象 ( Futures )。
Future<String> string = client.getString("http://foo.com/hello.txt");
// 以下代码将导致阻塞,并且,出现错误时还可能抛出异常!
String value = string.get();
未来对象也可以设置回调函数……
Future<String> string = client.getString("http://foo.com/hello.txt");
string.setCallback(new FutureCallback<String>() {
@Override
public void onCompleted(Exception e, String result) {
System.out.println(result);
}
});
简易写法……
client.getString("http://foo.com/hello.txt")
.setCallback(new FutureCallback<String>() {
@Override
public void onCompleted(Exception e, String result) {
System.out.println(result);
}
});
未知美人
HxLauncher: Launch Android applications by voice commands