项目作者: tanyinqing

项目描述 :
xutils这个框架的demo studio版本
高级语言: Java
项目地址: git://github.com/tanyinqing/XUtils3.git
创建时间: 2017-12-28T08:34:23Z
项目社区:https://github.com/tanyinqing/XUtils3

开源协议:

下载


备注细节

导入软件发生的编译错误

文件清单

其他

FragmentManager事务

使用Aar文件时要进行配置

生成自定义apk包

xutils这个框架的demo

测试


返回

测试


返回

生成自定义apk包

  1. //配置自定义打包名称
  2. applicationVariants.all { variant ->
  3. variant.outputs.each { output ->
  4. def outputFile = output.outputFile
  5. def fileName
  6. if (outputFile != null && outputFile.name.endsWith('.apk')) {
  7. if (variant.buildType.name.equals('release')) {
  8. variant.mergedFlavor.versionName = getVersionName()
  9. //fileName = "XXXX_${variant.mergedFlavor.versionName}_release.apk"
  10. fileName = "WorkTracking20171218.apk"// 让图片放开 改ip 关闭log与内存卡的log
  11. // fileName = "app-release.apk"// 内测版 让图片放开 改ip 关闭log与内存卡的log
  12. } else if (variant.buildType.name.equals('debug')) {
  13. //variant.mergedFlavor.versionName = getVersionName()+"."+releaseTime()
  14. variant.mergedFlavor.versionName = getVersionName()
  15. fileName = "XXXX_${variant.mergedFlavor.versionName}_debug.apk"
  16. }
  17. output.outputFile = new File(outputFile.parent, fileName)
  18. }
  19. }
  20. } //配置自定义打包名称

返回

使用Aar文件时要进行配置

  • 使用Aar文件时要进行配置
  • compile(name: ‘tanyinqingmyaar-release’, ext: ‘aar’)

  • build.gradle(Module:app)中修改

  1. buildTypes {
  2. release {
  3. minifyEnabled false
  4. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  5. }
  6. }
  7. //以下这部分是使用aar新加的
  8. repositories {
  9. flatDir {
  10. dirs 'libs'
  11. }
  12. }//到此为止

返回

FragmentManager事务

  1. 事务每一次都要开启和提交
  2. public void onClick(View view) {
  3. fragmentTransaction = fragmentManage.beginTransaction();
  4. switch (view.getId()) {
  5. case R.id.button1:
  6. HttpFragment httpFragment = new HttpFragment();
  7. fragmentTransaction.replace(R.id.fragment_layout, httpFragment, "httpFragment");
  8. break;
  9. case R.id.button2:
  10. DbFragment dbFragment = new DbFragment();
  11. fragmentTransaction.replace(R.id.fragment_layout, dbFragment, "dbFragment");
  12. break;
  13. }
  14. fragmentTransaction.commit();
  15. }

返回

其他

返回

文件清单

包名 名称 说明 备注
activity HttpFragment 网络连接 备注
activity DbFragment 数据库 备注
activity ImageFragment 图片 备注
activity DownloadActivity 下载列表页 备注
activity 备注
activity 备注
activity 备注

返回

导入软件发生的编译错误

  • http://blog.csdn.net/u014231734/article/details/44725735
  • Android Studio 运行时出现 finished with non-zero exit value 2 错误分析
  • 原因:
    项目包含了两个相同包名的不同 project 或者 jar
  • 解决思路:
    删除多余的 jar
    如 V4包,只要将其中一个 module 中的 V4包干掉,然后引用另一个 有 V4包的Module 就哦了
  1. Error:Execution failed for task ':app:dexDebug'.
  2. > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_40\bin\java.exe''
  3. finished with non-zero exit value 2

返回

xUtils3简介

  • xUtils 包含了orm, http(s), image, view注解, 但依然很轻量级(246K), 并且特性强大, 方便扩展:
    • 稳定的基石: AbsTask和统一的回调接口Callback, 任何异常, 即使你的回调方法实现有异常都会进入onError, 任何情况下onFinished总会让你知道任务结束了.
    • 基于高效稳定的orm工具, http模块得以更方便的实现cookie(支持domain, path, expiry等特性)和
      缓存(支持Cache-Control, Last-Modified, ETag等特性)的支持.
    • 有了强大的http及其下载缓存的支持, image模块的实现相当的简洁, 并且支持回收被view持有, 但被Mem Cache移除的图片, 减少页面回退时的闪烁..
    • view注解模块仅仅400多行代码却灵活的支持了各种View注入和事件绑定, 包括拥有多了方法的listener的支持.

其他特性

  • 支持超大文件(超过2G)上传
  • 更全面的http请求协议支持(11种谓词)
  • 拥有更加灵活的ORM, 和greenDao一致的性能
  • 更多的事件注解支持且不受混淆影响…
  • 图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转…
  • 从3.5.0开始不再包含libwebpbackport.so, 需要在Android4.2以下设备兼容webp的请使用3.4.0版本.

使用Gradle构建时添加一下依赖即可:

  1. compile 'org.xutils:xutils:3.5.0'
如果使用eclipse可以 点击这里下载aar文件, 然后用zip解压, 取出jar文件.
混淆配置参考示例项目sample的配置

常见问题:

  1. 更好的管理图片缓存: https://github.com/wyouflf/xUtils3/issues/149
  2. Cookie的使用: https://github.com/wyouflf/xUtils3/issues/125
  3. 关于query参数? http请求可以通过 header, url, body(请求体)传参; query参数是url中问号(?)后面的参数.
  4. 关于body参数? body参数只有PUT, POST, PATCH, DELETE(老版本RFC2616文档没有明确指出它是否支持, 所以暂时支持)请求支持.
  5. 自定义Http参数对象和结果解析: https://github.com/wyouflf/xUtils3/issues/191

使用前配置

需要的权限
  1. <uses-permission android:name="android.permission.INTERNET" ></uses-permission>
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
初始化
  1. // 在application的onCreate中初始化
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. x.Ext.init(this);
  6. x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
  7. ...
  8. }

使用@Event事件注解(@ContentView, @ViewInject等更多示例参考sample项目)

  1. /**
  2. * 1. 方法必须私有限定,
  3. * 2. 方法参数形式必须和type对应的Listener接口一致.
  4. * 3. 注解参数value支持数组: value={id1, id2, id3}
  5. * 4. 其它参数说明见{@link org.xutils.event.annotation.Event}类的说明.
  6. **/
  7. @Event(value = R.id.btn_test_baidu1,
  8. type = View.OnClickListener.class/*可选参数, 默认是View.OnClickListener.class*/)
  9. private void onTestBaidu1Click(View view) {
  10. ...
  11. }

访问网络(更多示例参考sample项目)

  1. /**
  2. * 自定义实体参数类请参考:
  3. * 请求注解 {@link org.xutils.http.annotation.HttpRequest}
  4. * 请求注解处理模板接口 {@link org.xutils.http.app.ParamsBuilder}
  5. *
  6. * 需要自定义类型作为callback的泛型时, 参考:
  7. * 响应注解 {@link org.xutils.http.annotation.HttpResponse}
  8. * 响应注解处理模板接口 {@link org.xutils.http.app.ResponseParser}
  9. *
  10. * 示例: 查看 org.xutils.sample.http 包里的代码
  11. */
  12. BaiduParams params = new BaiduParams();
  13. params.wd = "xUtils";
  14. // 有上传文件时使用multipart表单, 否则上传原始文件流.
  15. // params.setMultipart(true);
  16. // 上传文件方式 1
  17. // params.uploadFile = new File("/sdcard/test.txt");
  18. // 上传文件方式 2
  19. // params.addBodyParameter("uploadFile", new File("/sdcard/test.txt"));
  20. Callback.Cancelable cancelable
  21. = x.http().get(params,
  22. /**
  23. * 1. callback的泛型:
  24. * callback参数默认支持的泛型类型参见{@link org.xutils.http.loader.LoaderFactory},
  25. * 例如: 指定泛型为File则可实现文件下载, 使用params.setSaveFilePath(path)指定文件保存的全路径.
  26. * 默认支持断点续传(采用了文件锁和尾端校验续传文件的一致性).
  27. * 其他常用类型可以自己在LoaderFactory中注册,
  28. * 也可以使用{@link org.xutils.http.annotation.HttpResponse}
  29. * 将注解HttpResponse加到自定义返回值类型上, 实现自定义ResponseParser接口来统一转换.
  30. * 如果返回值是json形式, 那么利用第三方的json工具将十分容易定义自己的ResponseParser.
  31. * 如示例代码{@link org.xutils.sample.http.BaiduResponse}, 可直接使用BaiduResponse作为
  32. * callback的泛型.
  33. *
  34. * 2. callback的组合:
  35. * 可以用基类或接口组合个种类的Callback, 见{@link org.xutils.common.Callback}.
  36. * 例如:
  37. * a. 组合使用CacheCallback将使请求检测缓存或将结果存入缓存(仅GET请求生效).
  38. * b. 组合使用PrepareCallback的prepare方法将为callback提供一次后台执行耗时任务的机会,
  39. * 然后将结果给onCache或onSuccess.
  40. * c. 组合使用ProgressCallback将提供进度回调.
  41. * ...(可参考{@link org.xutils.image.ImageLoader}
  42. * 或 示例代码中的 {@link org.xutils.sample.download.DownloadCallback})
  43. *
  44. * 3. 请求过程拦截或记录日志: 参考 {@link org.xutils.http.app.RequestTracker}
  45. *
  46. * 4. 请求Header获取: 参考 {@link org.xutils.http.app.RequestInterceptListener}
  47. *
  48. * 5. 其他(线程池, 超时, 重定向, 重试, 代理等): 参考 {@link org.xutils.http.RequestParams}
  49. *
  50. **/
  51. new Callback.CommonCallback<String>() {
  52. @Override
  53. public void onSuccess(String result) {
  54. Toast.makeText(x.app(), result, Toast.LENGTH_LONG).show();
  55. }
  56. @Override
  57. public void onError(Throwable ex, boolean isOnCallback) {
  58. //Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
  59. if (ex instanceof HttpException) { // 网络错误
  60. HttpException httpEx = (HttpException) ex;
  61. int responseCode = httpEx.getCode();
  62. String responseMsg = httpEx.getMessage();
  63. String errorResult = httpEx.getResult();
  64. // ...
  65. } else { // 其他错误
  66. // ...
  67. }
  68. Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
  69. }
  70. @Override
  71. public void onCancelled(CancelledException cex) {
  72. Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show();
  73. }
  74. @Override
  75. public void onFinished() {
  76. }
  77. });
  78. // cancelable.cancel(); // 取消请求

如果你只需要一个简单的版本:

  1. @Event(value = R.id.btn_test_baidu2)
  2. private void onTestBaidu2Click(View view) {
  3. RequestParams params = new RequestParams("https://www.baidu.com/s");
  4. params.setSslSocketFactory(...); // 设置ssl
  5. params.addQueryStringParameter("wd", "xUtils");
  6. x.http().get(params, new Callback.CommonCallback<String>() {
  7. @Override
  8. public void onSuccess(String result) {
  9. Toast.makeText(x.app(), result, Toast.LENGTH_LONG).show();
  10. }
  11. @Override
  12. public void onError(Throwable ex, boolean isOnCallback) {
  13. Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
  14. }
  15. @Override
  16. public void onCancelled(CancelledException cex) {
  17. Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show();
  18. }
  19. @Override
  20. public void onFinished() {
  21. }
  22. });
  23. }
  24. `

带有缓存的请求示例:

  1. BaiduParams params = new BaiduParams();
  2. params.wd = "xUtils";
  3. // 默认缓存存活时间, 单位:毫秒.(如果服务没有返回有效的max-age或Expires)
  4. params.setCacheMaxAge(1000 * 60);
  5. Callback.Cancelable cancelable
  6. // 使用CacheCallback, xUtils将为该请求缓存数据.
  7. = x.http().get(params, new Callback.CacheCallback<String>() {
  8. private boolean hasError = false;
  9. private String result = null;
  10. @Override
  11. public boolean onCache(String result) {
  12. // 得到缓存数据, 缓存过期后不会进入这个方法.
  13. // 如果服务端没有返回过期时间, 参考params.setCacheMaxAge(maxAge)方法.
  14. //
  15. // * 客户端会根据服务端返回的 header 中 max-age 或 expires 来确定本地缓存是否给 onCache 方法.
  16. // 如果服务端没有返回 max-age 或 expires, 那么缓存将一直保存, 除非这里自己定义了返回false的
  17. // 逻辑, 那么xUtils将请求新数据, 来覆盖它.
  18. //
  19. // * 如果信任该缓存返回 true, 将不再请求网络;
  20. // 返回 false 继续请求网络, 但会在请求头中加上ETag, Last-Modified等信息,
  21. // 如果服务端返回304, 则表示数据没有更新, 不继续加载数据.
  22. //
  23. this.result = result;
  24. return false; // true: 信任缓存数据, 不在发起网络请求; false不信任缓存数据.
  25. }
  26. @Override
  27. public void onSuccess(String result) {
  28. // 注意: 如果服务返回304 或 onCache 选择了信任缓存, 这时result为null.
  29. if (result != null) {
  30. this.result = result;
  31. }
  32. }
  33. @Override
  34. public void onError(Throwable ex, boolean isOnCallback) {
  35. hasError = true;
  36. Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
  37. if (ex instanceof HttpException) { // 网络错误
  38. HttpException httpEx = (HttpException) ex;
  39. int responseCode = httpEx.getCode();
  40. String responseMsg = httpEx.getMessage();
  41. String errorResult = httpEx.getResult();
  42. // ...
  43. } else { // 其他错误
  44. // ...
  45. }
  46. }
  47. @Override
  48. public void onCancelled(CancelledException cex) {
  49. Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show();
  50. }
  51. @Override
  52. public void onFinished() {
  53. if (!hasError && result != null) {
  54. // 成功获取数据
  55. Toast.makeText(x.app(), result, Toast.LENGTH_LONG).show();
  56. }
  57. }
  58. });

使用数据库(更多示例参考sample项目)

  1. Parent test = db.selector(Parent.class).where("id", "in", new int[]{1, 3, 6}).findFirst();
  2. long count = db.selector(Parent.class).where("name", "LIKE", "w%").and("age", ">", 32).count();
  3. List<Parent> testList = db.selector(Parent.class).where("id", "between", new String[]{"1", "5"}).findAll();

绑定图片(更多示例参考sample项目)

  1. x.image().bind(imageView, url, imageOptions);
  2. // assets file
  3. x.image().bind(imageView, "assets://test.gif", imageOptions);
  4. // local file
  5. x.image().bind(imageView, new File("/sdcard/test.gif").toURI().toString(), imageOptions);
  6. x.image().bind(imageView, "/sdcard/test.gif", imageOptions);
  7. x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions);
  8. x.image().bind(imageView, "file:/sdcard/test.gif", imageOptions);
  9. x.image().bind(imageView, url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
  10. x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
  11. // 用来获取缓存文件
  12. x.image().loadFile(url, imageOptions, new Callback.CommonCallback<File>() {...});

关于作者

  • Email: wyouflf@qq.com, wyouflf@gmail.com
  • 有任何建议或者使用中遇到问题都可以给我发邮件, 你也可以加入QQ群:330445659(已满), 275967695, 257323060,
    384426013, 176778777, 169852490, 261053948, 330108003, 技术交流,idea分享 _