[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-4354":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":16,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":16,"starSnapshotCount":16,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},4354,"xUtils3","wyouflf\u002FxUtils3","wyouflf","Android orm, bitmap, http, view inject... ","https:\u002F\u002Fgitee.com\u002Fwyouflf\u002FxUtils3",null,"Java",5946,1956,347,37,0,65.87,"Other",false,"master",true,[],"2026-06-12 04:00:22","## xUtils3简介\n\nxUtils 包含了orm, http(s), image, view注解, 但依然很轻量级(251K), 并且特性强大, 方便扩展.\n\n#### 1. `orm`: 高效稳定的orm工具, 使得http接口实现时更方便的支持cookie和缓存.\n* 灵活的, 类似linq表达式的接口.\n* 和greenDao一致的性能.\n\n#### 2. `http(s)`: 基于UrlConnection, Android4.4以后底层为okHttp实现.\n* 请求协议支持11种谓词: GET,POST,PUT,PATCH,HEAD,MOVE,COPY,DELETE,OPTIONS,TRACE,CONNECT\n* 支持超大文件(超过2G)上传\n* 支持断点下载(如果服务端支持Range参数,客户端自动处理断点下载)\n* 支持cookie(实现了domain, path, expiry等特性)\n* 支持缓存(实现了Cache-Control, Last-Modified, ETag等特性, 缓存内容过多时使用过期时间+LRU双重机制清理)\n* 支持异步和同步(可结合RxJava使用)调用\n\n#### 3. `image`: 有了`http(s)`及其下载缓存的支持, `image`模块的实现相当的简洁.\n* 支持内存缓存, 磁盘缓存(缩略图和原图), 并且支持回收被view持有, 但被MemCache移除的图片, 减少页面回退时的闪烁.\n* 支持在ListView滑动时, 自动停止被回收复用的item对应的下载任务(再次下载时断点续传)\n* 支持webp, gif(部分比较老的系统只展示静态图)\n* 支持圆角, 圆形, 方形等裁剪, 支持自动旋转...\n\n#### 4. `view注解`: view注解模块仅仅400多行代码却灵活的支持了各种View注入和事件绑定.\n* 事件注解支持且不受混淆影响...([参考混淆配置](xutils\u002Fconsumer-rules.pro))\n* 支持绑定拥有多个方法的listener\n\n#### 使用Gradle构建时添加以下依赖即可:\n```javascript\nimplementation 'org.xutils:xutils:3.9.0'\n```\n\n#### 混淆配置参考示例项目sample的配置\n[这里可以下载aar文件](http:\u002F\u002Fdl.bintray.com\u002Fwyouflf\u002Fmaven\u002Forg\u002Fxutils\u002Fxutils\u002F)\n\n\n### 常见问题:\n1. 更好的管理图片缓存: https:\u002F\u002Fgithub.com\u002Fwyouflf\u002FxUtils3\u002Fissues\u002F149\n2. Cookie的使用: https:\u002F\u002Fgithub.com\u002Fwyouflf\u002FxUtils3\u002Fissues\u002F125\n3. 关于query参数? http请求可以通过 header, url, body(请求体)传参; query参数是url中问号(?)后面的参数.\n4. 关于body参数? body参数只有PUT, POST, PATCH, DELETE(老版本RFC2616文档没有明确指出它是否支持, 所以暂时支持)请求支持.\n5. 自定义Http参数对象和结果解析: https:\u002F\u002Fgithub.com\u002Fwyouflf\u002FxUtils3\u002Fissues\u002F191\n6. 设置了http超时时间为5s但任然等待15s左右: GET请求失败后默认会重试2次, 可以通过setMaxRetryCount(0)来防止请求自动重试.\n7. @Event注解同一个id子类的事件会覆盖父类, onClickListener和onItemClickListener默认屏蔽了双击这种手机上不常用操作, 如需要双击支持可以自己setOnClickListener.\n\n#### 使用前配置\n##### 需要的权限\n```xml\n\u003Cuses-permission android:name=\"android.permission.INTERNET\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" \u002F>\u003C!-- 可选 -->\n```\n##### 初始化\n```java\n\u002F\u002F 在application的onCreate中初始化\n@Override\npublic void onCreate() {\n    super.onCreate();\n    x.Ext.init(this);\n    x.Ext.setDebug(BuildConfig.DEBUG); \u002F\u002F 是否输出debug日志, 开启debug会影响性能.\n    ...\n}\n```\n\n### 使用@Event事件注解(@ContentView, @ViewInject等更多示例参考sample项目)\n```java\n\u002F**\n * 1. 方法必须私有限定,\n * 2. 方法参数形式必须和type对应的Listener接口一致.\n * 3. 注解参数value支持数组: value={id1, id2, id3}\n * 4. 其它参数说明见{@link org.xutils.event.annotation.Event}类的说明.\n **\u002F\n@Event(value = R.id.btn_test1,\n        type = View.OnClickListener.class\u002F*可选参数, 默认是View.OnClickListener.class*\u002F)\nprivate void onTest1Click(View view) {\n...\n}\n```\n\n### 使用数据库(更多示例参考sample项目)\n```java\nParent test = db.selector(Parent.class)\n                    .where(\"id\", \"in\", new int[]{1, 3, 6})\n                    .or(\"age\", \"\u003C\", 29)\n                    .findFirst();\nlong count = db.selector(Parent.class)\n                    .where(\"name\", \"LIKE\", \"w%\")\n                    .and(\"age\", \">\", 32)\n                    .count();\nList\u003CParent> testList = db.selector(Parent.class)\n                    .where(\"id\", \"between\", new String[]{\"1\", \"5\"})\n                    .findAll();\nList\u003CDbModel> list = db.selector(Child.class)\n                    .where(\"age\", \"\u003C\", 18)\n                    .groupBy(\"parentId\")\n                    .having(WhereBuilder.b(\"COUNT(parentId)\", \">\", 1))\n                    .select(\"parentId, COUNT(parentId) as childNum\")\n                    .findAll();\n```\n\n### 访问网络(更多示例参考sample项目)\n#### 如果你只需要一个简单的网络请求:\n```java\n@Event(value = R.id.btn_test2)\nprivate void onTest2Click(View view) {\n    RequestParams params = new RequestParams(\"https:\u002F\u002Fwww.baidu.com\u002Fs\");\n    \u002F\u002F params.setSslSocketFactory(...); \u002F\u002F 如果需要自定义SSL\n    params.addQueryStringParameter(\"wd\", \"xUtils\");\n    x.http().get(params, new Callback.CommonCallback\u003CString>() {\n        @Override\n        public void onSuccess(String result) {\n            Toast.makeText(x.app(), result, Toast.LENGTH_LONG).show();\n        }\n\n        @Override\n        public void onError(Throwable ex, boolean isOnCallback) {\n            Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();\n        }\n\n        @Override\n        public void onCancelled(CancelledException cex) {\n            Toast.makeText(x.app(), \"cancelled\", Toast.LENGTH_LONG).show();\n        }\n\n        @Override\n        public void onFinished() {\n\n        }\n    });\n}\n````\n#### json或protobuf类型请求的处理\n```java\n\u002F**\n * 自定义实体参数类请参考:\n * 请求注解 {@link org.xutils.http.annotation.HttpRequest}\n * 请求注解处理模板接口 {@link org.xutils.http.app.ParamsBuilder}\n *\n * 需要自定义类型作为callback的泛型时, 参考:\n * 响应注解 {@link org.xutils.http.annotation.HttpResponse}\n * 响应注解处理模板接口 {@link org.xutils.http.app.ResponseParser}\n *\n * 示例: 查看 org.xutils.sample.http 包里的代码\n *\u002F\nJsonDemoParams params = new JsonDemoParams();\nparams.wd = \"xUtils\";\n\u002F\u002F 有上传文件时使用multipart表单, 否则上传原始文件流.\n\u002F\u002F params.setMultipart(true);\n\u002F\u002F 上传文件方式 1\n\u002F\u002F params.uploadFile = new File(\"\u002Fsdcard\u002Ftest.txt\");\n\u002F\u002F 上传文件方式 2\n\u002F\u002F params.addBodyParameter(\"uploadFile\", new File(\"\u002Fsdcard\u002Ftest.txt\"));\nCallback.Cancelable cancelable\n       = x.http().get(params,\n       \u002F**\n       * 1. callback的泛型:\n       * callback参数默认支持的泛型类型参见{@link org.xutils.http.loader.LoaderFactory},\n       * 例如: 指定泛型为File则可实现文件下载, 使用params.setSaveFilePath(path)指定文件保存的全路径, 默认支持断点续传(采用了文件锁防止多线程\u002F进程修改文件,及文件末端校验续传文件的一致性).\n       * \n       * 自定义callback的泛型支持方案1, 自定义某一Class的转换(不够灵活): \n       * 结合PrepareCallback的两个泛型参数, 第一个泛型参数类型使用LoaderFactory已经支持的, 第二个泛型参数作为最终输出, 需要在prepare方法中自己实现.\n       * 一个稍复杂的例子可以参考{@link org.xutils.image.ImageLoader}\n       *\n       * 自定义callback的泛型支持方案2, 自定义一类数据的自动转化: \n       * 将注解@HttpResponse加到自定义返回值类型上, 实现自定义ResponseParser接口来统一转换.\n       * 如果返回值是json\u002Fxml\u002Fprotobuf等数据格式, 那么利用第三方的json\u002Fxml\u002Fprotobuf等工具将十分容易定义自己的ResponseParser.\n       * 如示例代码{@link org.xutils.demo.http.JsonDemoResponse}, 可直接使用JsonDemoResponse作为callback的泛型.\n       *\n       * 2. callback的组合:\n       * 可以用基类或接口组合个种类的Callback, 见{@link org.xutils.common.Callback}.\n       * 例如:\n       * a. 组合使用CacheCallback将使请求检测缓存或将结果存入缓存(仅GET和POST请求生效).\n       * b. 组合使用PrepareCallback的prepare方法将为callback提供一次后台执行耗时任务的机会, 然后将结果给onCache或onSuccess.\n       * c. 组合使用ProgressCallback将提供进度回调.\n       * 可参考{@link org.xutils.image.ImageLoader} 或 示例代码中的 {@link org.xutils.demo.download.DownloadCallback}\n       *\n       * 3. 请求过程拦截或记录日志: 参考 {@link org.xutils.http.app.RequestTracker}\n       *\n       * 4. 请求Header获取: 参考 {@link org.xutils.demo.http.JsonResponseParser} 或 {@link org.xutils.http.app.RequestInterceptListener}\n       *\n       * 5. 其他(线程池, 超时, 重定向, 重试, 代理等): 参考 {@link org.xutils.http.RequestParams}\n       *\n       **\u002F\n       new Callback.CommonCallback\u003CJsonDemoResponse>() {\n           @Override\n           public void onSuccess(JsonDemoResponse result) {\n               Toast.makeText(x.app(), result.toString(), Toast.LENGTH_LONG).show();\n           }\n\n           @Override\n           public void onError(Throwable ex, boolean isOnCallback) {\n               \u002F\u002FToast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();\n               if (ex instanceof HttpException) { \u002F\u002F 网络错误\n                   HttpException httpEx = (HttpException) ex;\n                   int responseCode = httpEx.getCode();\n                   String responseMsg = httpEx.getMessage();\n                   String errorResult = httpEx.getResult();\n                   \u002F\u002F ...\n               } else { \u002F\u002F 其他错误\n                   \u002F\u002F ...\n               }\n               Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();\n           }\n\n           @Override\n           public void onCancelled(CancelledException cex) {\n               Toast.makeText(x.app(), \"cancelled\", Toast.LENGTH_LONG).show();\n           }\n\n           @Override\n           public void onFinished() {\n\n           }\n       });\n\n\u002F\u002F cancelable.cancel(); \u002F\u002F 取消请求\n```\n#### 带有缓存的请求示例:\n```java\nJsonDemoParams params = new JsonDemoParams();\nparams.wd = \"xUtils\";\n\u002F\u002F 默认缓存存活时间, 单位:毫秒.(如果服务没有返回有效的max-age或Expires)\nparams.setCacheMaxAge(1000 * 60);\nCallback.Cancelable cancelable\n    \t\u002F\u002F 使用CacheCallback, xUtils将为该请求缓存数据.\n\t\t= x.http().get(params, new Callback.CacheCallback\u003CJsonDemoResponse>() {\n\n\tprivate boolean hasError = false;\n\tprivate String result = null;\n\n\t@Override\n\tpublic boolean onCache(JsonDemoResponse result) {\n\t\t\u002F\u002F 得到缓存数据, 缓存过期后不会进入这个方法.\n\t\t\u002F\u002F 如果服务端没有返回过期时间, 参考params.setCacheMaxAge(maxAge)方法.\n        \u002F\u002F\n        \u002F\u002F * 客户端会根据服务端返回的 header 中 max-age 或 expires 来确定本地缓存是否给 onCache 方法.\n        \u002F\u002F   如果服务端没有返回 max-age 或 expires, 那么缓存将一直保存, 除非这里自己定义了返回false的\n        \u002F\u002F   逻辑, 那么xUtils将请求新数据, 来覆盖它.\n        \u002F\u002F\n        \u002F\u002F * 如果信任该缓存返回 true, 将不再请求网络;\n        \u002F\u002F   返回 false 继续请求网络, 但会在请求头中加上ETag, Last-Modified等信息,\n        \u002F\u002F   如果服务端返回304, 则表示数据没有更新, 不继续加载数据.\n        \u002F\u002F\n        this.result = result;\n        return false; \u002F\u002F true: 信任缓存数据, 不在发起网络请求; false不信任缓存数据.\n\t}\n\n\t@Override\n\tpublic void onSuccess(JsonDemoResponse result) {\n\t\t\u002F\u002F 注意: 如果服务返回304 或 onCache 选择了信任缓存, 这时result为null.\n        if (result != null) {\n\t\t    this.result = result;\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onError(Throwable ex, boolean isOnCallback) {\n\t\thasError = true;\n\t\tToast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();\n\t\tif (ex instanceof HttpException) { \u002F\u002F 网络错误\n\t\t\tHttpException httpEx = (HttpException) ex;\n\t\t\tint responseCode = httpEx.getCode();\n\t\t\tString responseMsg = httpEx.getMessage();\n\t\t\tString errorResult = httpEx.getResult();\n\t\t\t\u002F\u002F ...\n\t\t} else { \u002F\u002F 其他错误\n\t\t\t\u002F\u002F ...\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onCancelled(CancelledException cex) {\n\t\tToast.makeText(x.app(), \"cancelled\", Toast.LENGTH_LONG).show();\n\t}\n\n\t@Override\n\tpublic void onFinished() {\n\t\tif (!hasError && result != null) {\n\t\t\t\u002F\u002F 成功获取数据\n\t\t\tToast.makeText(x.app(), result, Toast.LENGTH_LONG).show();\n\t\t}\n\t}\n});\n```\n\n### 绑定图片(更多示例参考sample项目)\n```java\nx.image().bind(imageView, url, imageOptions);\n\n\u002F\u002F assets file\nx.image().bind(imageView, \"assets:\u002F\u002Ftest.gif\", imageOptions);\n\n\u002F\u002F resources file\nx.image().bind(imageView, \"res:\u002F\u002F\" + R.minimap.test, imageOptions);\n\n\u002F\u002F local file\nx.image().bind(imageView, new File(\"\u002Fsdcard\u002Ftest.gif\").toURI().toString(), imageOptions);\nx.image().bind(imageView, \"\u002Fsdcard\u002Ftest.gif\", imageOptions);\nx.image().bind(imageView, \"file:\u002F\u002F\u002Fsdcard\u002Ftest.gif\", imageOptions);\nx.image().bind(imageView, \"file:\u002Fsdcard\u002Ftest.gif\", imageOptions);\n\nx.image().bind(imageView, url, imageOptions, new Callback.CommonCallback\u003CDrawable>() {...});\nx.image().loadDrawable(url, imageOptions, new Callback.CommonCallback\u003CDrawable>() {...});\n\u002F\u002F 用来获取缓存文件\nx.image().loadFile(url, imageOptions, new Callback.CommonCallback\u003CFile>() {...});\n```\n\n----\n### 关于作者\n* Email： \u003Cwyouflf@qq.com>, \u003Cwyouflf@gmail.com>\n* 有任何建议或者使用中遇到问题都可以给我发邮件, 你也可以加入QQ群：330445659(已满), 275967695, 257323060,\n384426013, 176778777, 169852490, 261053948, 330108003, 技术交流，idea分享 *_*\n","xUtils3 是一个轻量级且功能强大的Android开发工具包，主要提供了ORM、HTTP(S)请求、图片处理以及View注解等功能。其核心特性包括高效稳定的ORM工具，支持多种HTTP谓词和断点下载的HTTP模块，以及简洁而高效的图片加载与缓存机制。此外，xUtils3还拥有简单易用的View注解系统，能够极大简化UI开发流程。该项目非常适合需要快速构建稳定可靠的移动应用开发者使用，特别是在需要处理复杂网络请求、数据持久化以及优化用户体验的应用场景中表现尤为出色。",2,"2026-06-11 02:59:49","top_language"]