2019年12月工作整理

2019年12月工作整理

  • 1202
      • 关于compileDebugJavaWithJavac的错误信息
      • 关于TextView设置ClickableSpan
        • 点击结尾空白位置也响应点击的问题
        • 点击有点击事件的文字出现下面的背景色
  • 1203
      • ClickableSpan 引起的内存泄漏
  • 1204
      • android富文本 加载带图片的html
  • 1205
      • 骨架屏
  • 1209
      • Dialog弹出状态栏变黑的问题
  • 1210
      • 常用转义符
  • 1211
      • databinding 中字符串拼接的问题
  • 1213
      • AndResGuard压缩会影响性能吗
  • 1218
      • RecyclerView 设置分割线
  • 1220
      • com.google.gson Gson 解析时报错: declares multiple JSON fields named XXX
  • 1225
      • 使用GSON 转换的时候报下面的错误
  • 1230
      • Caused by: java.lang.IllegalStateException: Expected Android API level 21+ but was 19
  • 1231
      • retrofit上传附件时候文件名是中文问题

1202

关于compileDebugJavaWithJavac的错误信息

可以使用下面的命令查看具体的错误信息

gradlew compileDebugSources --stacktrace -info

关于TextView设置ClickableSpan

点击结尾空白位置也响应点击的问题

项目中需要在一段文字的最后两个字加点击事件,正常设置之后发现点击结尾空白的位置也会响应点击事件。明明已经设置了点击区间。

解决方法:在后边紧接着追加一个0宽度字

builder.append("\u200b");

或者直接在文字后面添加。参考文档

点击有点击事件的文字出现下面的背景色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T5Ho7jek-1578121774004)在这里插入图片描述
很丑,如何修改呢?

这里就需要用到TextView的setHighlightColor属性,Android4.0以上默认是淡绿色,低版本的是黄色。
我们需要通过这个方法重新设置背景色。

1203

ClickableSpan 引起的内存泄漏

项目中接入leakcanary后,今天早上发现一条内存泄漏由ClickableSpan引起的,百度之后果然有人和遇到同样的问题,这里记录一下。


解决方法:参考文献

1204

android富文本 加载带图片的html

  • https://blog.csdn.net/soullines/article/details/75669585

1205

骨架屏

即表示在页面完全渲染完成之前,用户会看到一个占位的样式,用以描绘了当前页面的大致框架,加载完成后,最终骨架屏中各个占位部分将被真实的数据替换。
2019年12月工作整理_第1张图片

骨架屏(Skeleton Screen)在Android中的应用

1209

Dialog弹出状态栏变黑的问题

项目中底部回复框,用的是DialogFragment,设置了Window的高度为WindowManager.LayoutParams.MATCH_PARENT的时候,当dialog弹出的时候,状态栏为变色黑色的(设置成固定高度的时候,并不会变黑)


解决办法:手动设置状态栏为透明状态

// 设置宽度为屏宽, 靠近屏幕底部。
Window window = getDialog().getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
// 设置状态栏为透明色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
lp.gravity = Gravity.BOTTOM;
lp.width = WindowManager.LayoutParams.MATCH_PARENT; 
// WindowManager.LayoutParams.MATCH_PARENT换成固定高度不会出现黑色状态栏
lp.height = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(lp);

1210

常用转义符

空格  ;  ;
< 小于号 <; <;
> 大于号 >; >;
& 与号 &; &;
” 引号 "; ";
‘ 撇号 &apos; ';
× 乘号 ×; ×;
÷ 除号 ÷; ÷;

1211

databinding 中字符串拼接的问题

databinding里面的拼接不能像下面这样

android:text='@{"username:"+bean.name}' 

这样编译的时候会报错
正确的写法是下面这样

android:text='@{@string/user_name+bean.name}'  

需采用 @string/xxxx的形式进行字符串的拼接

1213

AndResGuard压缩会影响性能吗

resources.arsc压缩会影响性能吗
AndResGuard is promoting some bad practices

1218

RecyclerView 设置分割线

RecyclerView 增加了设置分割新的类

androidx.recyclerview.widget.DividerItemDecoration

1220

com.google.gson Gson 解析时报错: declares multiple JSON fields named XXX

报错内容如下:

java.lang.IllegalArgumentException: class com.caiyu.m_home.entity.allreply.ReplyListEntity declares multiple JSON fields named viewModel

原因是:子类和父类有相同的字段属性。
解决办法:

  • (1)将父类中的该字段去掉(不要),或者在需要打印的字段上加上注解@Expose
  • (2):由于我报错的类都是在jar包里面,所以第一种方法不好使。只好采用其他日志输出的方法-- com.alibaba.fastjson.JSON.toJson();

1225

使用GSON 转换的时候报下面的错误

  • Unable to create converter for xxx
  • Attempt to invoke virtual method ‘java.lang.reflect.Method java.lang.Class.getMethod(java.lang.String, java.lang.Class[])’
  • Can not make a java.lang.reflect.Method constructor accessible

错误产生的原因,是在用Gson转换javaBean的时候,在类文件中存在有类型为java.lang.reflect.Method的字段的类型,所以报以上错误。检查确实是的,在该字段前面加上transient标记就可以了。

不过这个问题貌似在Android 9.0以上不会报,是在8.0上测试出来的。

1230

Caused by: java.lang.IllegalStateException: Expected Android API level 21+ but was 19

2019年12月工作整理_第2张图片
今早将项目在Android 4.4 手机上跑了一下,直接崩溃了,看到如上log信息,应该是版本问题,看了okhttp的官方介绍最新版的okhttp已经放弃4.4手机了
2019年12月工作整理_第3张图片

由于前几天将Retrofit的版本升到2.7,内置的okhttp最低支持5.0,现在要么放弃4.4的用户,用么将Retrofit的版本降到2.5可以解决问题。

1231

retrofit上传附件时候文件名是中文问题

Unexpected char 0x65b0 at 34 in Content-Disposition value: form-data; name=“file”;

测试人员在上传图片的时候,选择了一张中文命名的图片文件,导致程序崩溃。

okhttp3.Headers里面做了校验

static void checkName(String name) {
    if (name == null) throw new NullPointerException("name == null");
    if (name.isEmpty()) throw new IllegalArgumentException("name is empty");
    for (int i = 0, length = name.length(); i < length; i++) {
      char c = name.charAt(i);
      if (c <= '\u0020' || c >= '\u007f') {
        throw new IllegalArgumentException(Util.format(
            "Unexpected char %#04x at %d in header name: %s", (int) c, i, name));
      }
    }
  }

网上解决方案:

  • URLEncoder.encode(file.getName(),“UTF-8”);//App传递给后台时候编码
  • URLDecoder.decode(ss,“UTF-8”);//后台接到时候进行转码

我的解决方案是检查是否含有中文,然后重命名文件

你可能感兴趣的:(月度工作总结)