[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-4220":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":20,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":16,"starSnapshotCount":16,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},4220,"AndroidAsync","koush\u002FAndroidAsync","koush","Asynchronous socket, http(s) (client+server) and websocket library for android. Based on nio, not threads.","",null,"Java",7540,1545,397,338,0,1,65.67,"Other",false,"master",[],"2026-06-12 04:00:21","# AndroidAsync\r\n\r\nAndroidAsync is a low level network protocol library. If you are looking for an easy to use, higher level, Android aware,\r\nhttp request library, check out [Ion](https:\u002F\u002Fgithub.com\u002Fkoush\u002Fion) (it is built on top of AndroidAsync). The typical Android\r\napp developer would probably be more interested in Ion.\r\n\r\nBut if you're looking for a raw Socket, HTTP(s) client\u002Fserver, and WebSocket library for Android, AndroidAsync\r\nis it.\r\n\r\n#### Features\r\n * Based on NIO. Single threaded and callback driven.\r\n * All operations return a Future that can be cancelled\r\n * Socket client + socket server\r\n * HTTP client + server\r\n * WebSocket client + server\r\n\r\n### Download\r\n\r\nDownload [the latest JAR](https:\u002F\u002Fsearch.maven.org\u002Fremote_content?g=com.koushikdutta.async&a=androidasync&v=LATEST\r\n) or grab via Maven:\r\n\r\n```xml\r\n\u003Cdependency>\r\n    \u003CgroupId>com.koushikdutta.async\u003C\u002FgroupId>\r\n    \u003CartifactId>androidasync\u003C\u002FartifactId>\r\n    \u003Cversion>(insert latest version)\u003C\u002Fversion>\r\n\u003C\u002Fdependency>\r\n```\r\n\r\nGradle: \r\n```groovy\r\ndependencies {\r\n    compile 'com.koushikdutta.async:androidasync:2.+'\r\n}\r\n```\r\n\r\n### Download a url to a String\r\n\r\n```java\r\n\u002F\u002F url is the URL to download.\r\nAsyncHttpClient.getDefaultInstance().getString(url, new AsyncHttpClient.StringCallback() {\r\n    \u002F\u002F Callback is invoked with any exceptions\u002Ferrors, and the result, if available.\r\n    @Override\r\n    public void onCompleted(Exception e, AsyncHttpResponse response, String result) {\r\n        if (e != null) {\r\n            e.printStackTrace();\r\n            return;\r\n        }\r\n        System.out.println(\"I got a string: \" + result);\r\n    }\r\n});\r\n```\r\n\r\n\r\n### Download JSON from a url\r\n\r\n```java\r\n\u002F\u002F url is the URL to download.\r\nAsyncHttpClient.getDefaultInstance().getJSONObject(url, new AsyncHttpClient.JSONObjectCallback() {\r\n    \u002F\u002F Callback is invoked with any exceptions\u002Ferrors, and the result, if available.\r\n    @Override\r\n    public void onCompleted(Exception e, AsyncHttpResponse response, JSONObject result) {\r\n        if (e != null) {\r\n            e.printStackTrace();\r\n            return;\r\n        }\r\n        System.out.println(\"I got a JSONObject: \" + result);\r\n    }\r\n});\r\n```\r\n\r\nOr for JSONArrays...\r\n\r\n```java\r\n\u002F\u002F url is the URL to download.\r\nAsyncHttpClient.getDefaultInstance().getJSONArray(url, new AsyncHttpClient.JSONArrayCallback() {\r\n    \u002F\u002F Callback is invoked with any exceptions\u002Ferrors, and the result, if available.\r\n    @Override\r\n    public void onCompleted(Exception e, AsyncHttpResponse response, JSONArray result) {\r\n        if (e != null) {\r\n            e.printStackTrace();\r\n            return;\r\n        }\r\n        System.out.println(\"I got a JSONArray: \" + result);\r\n    }\r\n});\r\n```\r\n\r\n\r\n### Download a url to a file\r\n\r\n```java\r\nAsyncHttpClient.getDefaultInstance().getFile(url, filename, new AsyncHttpClient.FileCallback() {\r\n    @Override\r\n    public void onCompleted(Exception e, AsyncHttpResponse response, File result) {\r\n        if (e != null) {\r\n            e.printStackTrace();\r\n            return;\r\n        }\r\n        System.out.println(\"my file is available at: \" + result.getAbsolutePath());\r\n    }\r\n});\r\n```\r\n\r\n\r\n### Caching is supported too\r\n\r\n```java\r\n\u002F\u002F arguments are the http client, the directory to store cache files,\r\n\u002F\u002F and the size of the cache in bytes\r\nResponseCacheMiddleware.addCache(AsyncHttpClient.getDefaultInstance(),\r\n                                  getFileStreamPath(\"asynccache\"),\r\n                                  1024 * 1024 * 10);\r\n```\r\n\r\n\r\n### Need to do multipart\u002Fform-data uploads? That works too.\r\n\r\n```java\r\nAsyncHttpPost post = new AsyncHttpPost(\"http:\u002F\u002Fmyservercom\u002Fpostform.html\");\r\nMultipartFormDataBody body = new MultipartFormDataBody();\r\nbody.addFilePart(\"my-file\", new File(\"\u002Fpath\u002Fto\u002Ffile.txt\");\r\nbody.addStringPart(\"foo\", \"bar\");\r\npost.setBody(body);\r\nAsyncHttpClient.getDefaultInstance().executeString(post, new AsyncHttpClient.StringCallback(){\r\n        @Override\r\n        public void onCompleted(Exception ex, AsyncHttpResponse source, String result) {\r\n            if (ex != null) {\r\n                ex.printStackTrace();\r\n                return;\r\n            }\r\n            System.out.println(\"Server says: \" + result);\r\n        }\r\n    });\r\n```\r\n\r\n\r\n### Can also create web sockets:\r\n\r\n```java\r\nAsyncHttpClient.getDefaultInstance().websocket(get, \"my-protocol\", new WebSocketConnectCallback() {\r\n    @Override\r\n    public void onCompleted(Exception ex, WebSocket webSocket) {\r\n        if (ex != null) {\r\n            ex.printStackTrace();\r\n            return;\r\n        }\r\n        webSocket.send(\"a string\");\r\n        webSocket.send(new byte[10]);\r\n        webSocket.setStringCallback(new StringCallback() {\r\n            public void onStringAvailable(String s) {\r\n                System.out.println(\"I got a string: \" + s);\r\n            }\r\n        });\r\n        webSocket.setDataCallback(new DataCallback() {\r\n            public void onDataAvailable(DataEmitter emitter, ByteBufferList byteBufferList) {\r\n                System.out.println(\"I got some bytes!\");\r\n                \u002F\u002F note that this data has been read\r\n                byteBufferList.recycle();\r\n            }\r\n        });\r\n    }\r\n});\r\n```\r\n\r\n\r\n### AndroidAsync also let's you create simple HTTP servers:\r\n\r\n```java\r\nAsyncHttpServer server = new AsyncHttpServer();\r\n\r\nList\u003CWebSocket> _sockets = new ArrayList\u003CWebSocket>();\r\n\r\nserver.get(\"\u002F\", new HttpServerRequestCallback() {\r\n    @Override\r\n    public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {\r\n        response.send(\"Hello!!!\");\r\n    }\r\n});\r\n\r\n\u002F\u002F listen on port 5000\r\nserver.listen(5000);\r\n\u002F\u002F browsing http:\u002F\u002Flocalhost:5000 will return Hello!!!\r\n\r\n```\r\n\r\n### And WebSocket Servers:\r\n\r\n```java\r\nAsyncHttpServer httpServer = new AsyncHttpServer();\r\n\r\nhttpServer.listen(AsyncServer.getDefault(), port);\r\n\r\nhttpServer.websocket(\"\u002Flive\", new AsyncHttpServer.WebSocketRequestCallback() {\r\n    @Override\r\n    public void onConnected(final WebSocket webSocket, AsyncHttpServerRequest request) {\r\n        _sockets.add(webSocket);\r\n        \r\n        \u002F\u002FUse this to clean up any references to your websocket\r\n        webSocket.setClosedCallback(new CompletedCallback() {\r\n            @Override\r\n            public void onCompleted(Exception ex) {\r\n                try {\r\n                    if (ex != null)\r\n                        Log.e(\"WebSocket\", \"An error occurred\", ex);\r\n                } finally {\r\n                    _sockets.remove(webSocket);\r\n                }\r\n            }\r\n        });\r\n        \r\n        webSocket.setStringCallback(new StringCallback() {\r\n            @Override\r\n            public void onStringAvailable(String s) {\r\n                if (\"Hello Server\".equals(s))\r\n                    webSocket.send(\"Welcome Client!\");\r\n            }\r\n        });\r\n    \r\n    }\r\n});\r\n\r\n\u002F\u002F..Sometime later, broadcast!\r\nfor (WebSocket socket : _sockets)\r\n    socket.send(\"Fireball!\");\r\n```\r\n\r\n### Futures\r\n\r\nAll the API calls return [Futures](http:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFutures_and_promises).\r\n\r\n```java\r\nFuture\u003CString> string = client.getString(\"http:\u002F\u002Ffoo.com\u002Fhello.txt\");\r\n\u002F\u002F this will block, and may also throw if there was an error!\r\nString value = string.get();\r\n```\r\n\r\nFutures can also have callbacks...\r\n\r\n```java\r\nFuture\u003CString> string = client.getString(\"http:\u002F\u002Ffoo.com\u002Fhello.txt\");\r\nstring.setCallback(new FutureCallback\u003CString>() {\r\n    @Override\r\n    public void onCompleted(Exception e, String result) {\r\n        System.out.println(result);\r\n    }\r\n});\r\n```\r\n\r\nFor brevity...\r\n\r\n```java\r\nclient.getString(\"http:\u002F\u002Ffoo.com\u002Fhello.txt\")\r\n.setCallback(new FutureCallback\u003CString>() {\r\n    @Override\r\n    public void onCompleted(Exception e, String result) {\r\n        System.out.println(result);\r\n    }\r\n});\r\n```\r\n","AndroidAsync 是一个基于 NIO 的异步网络协议库，适用于 Android 平台的 Socket、HTTP(s)（客户端和服务器）及 WebSocket 开发。其核心功能包括单线程回调驱动的异步操作、所有操作返回可取消的 Future 对象、支持 Socket 客户端与服务器、HTTP 客户端与服务器以及 WebSocket 客户端与服务器。该库特别适合需要高性能且资源消耗低的网络通信场景，如实时消息传递、在线游戏或任何对响应时间有严格要求的应用程序。通过 Maven 或 Gradle 可轻松集成到项目中，并提供了下载 URL 内容为字符串、JSON 对象\u002F数组或文件等便捷方法。",2,"2026-06-11 02:59:04","top_language"]