组一台 i9-9900K 的黑苹果经验与总结

因为我的技术栈扩展的原因,导致我原本的 i5-7500 的台式机越来越不够用,决定攒一台速度比较快的黑苹果。

这篇文章主要是说了我在组这台电脑上的硬件和软件上的经验,希望可以帮到大家,毕竟也是很多前辈的文章才让我知道怎么做的。

放个图先

继续阅读“组一台 i9-9900K 的黑苹果经验与总结”

Dagger does not support injection into private fields

这是因为在 Kotlin 中,Field 生成的 Java 代码都是都是带 getset 的,然后 Field 是要设置为 private 的,下面就是生成的代码

@Nullable
@Inject
private volatile DispatchingAndroidInjector androidInjector;

@Nullable
   public final DispatchingAndroidInjector getAndroidInjector() {
      return this.androidInjector;
   }

   public final void setAndroidInjector(@Nullable DispatchingAndroidInjector var1) {
      this.androidInjector = var1;
   }

这种情况我们有两种方法解决

第一种,让它变回 Java 原本的样子

增加 JvmField

@Inject
@JvmField
var androidInjector: DispatchingAndroidInjector<Any?>? = null

这样生成的代码就会变成

@Inject
@JvmField
@Nullable
public volatile DispatchingAndroidInjector androidInjector;

这样就完全没有问题了,但是这样会把属性暴露出去,不是很好。因为kotlin是没有包内属性的,你也改不了为包内属性。

第二种,设置 set 方法为 Inject

以为 dagger 是支持注入方法的,直接标记属性的 setter 方法也能解决这问题,代码如下

@Volatile
@set:Inject
var androidInjector: DispatchingAndroidInjector<Any?>? = null

对应的 Java代码就会变成这样

   @Nullable
   private DispatchingAndroidInjector androidInjector;

   @Nullable
   public final DispatchingAndroidInjector getAndroidInjector() {
      return this.androidInjector;
   }

   @Inject
   public final void setAndroidInjector(@Nullable DispatchingAndroidInjector var1) {
      this.androidInjector = var1;
   }

这是一个比较好的实现,不会影响原有的访问域,代码编写也比较方便

这里有个小问题
如果你在 Android Studio 3.5到 3.6 编译这个代码,会报下面这个错误

An exception occurred: java.lang.IllegalArgumentException: not a > valid name: Provider

但是,用命令行编译是没有问题的,所以我把 Android Studio 升级到 4.0,重新编译之后就没有这个问题。

上面没用,乖乖用 lateinit var 啥事都没有

ButterKnife 替代计划

为什么要换掉 ButterKnift

  • 库中使用的是 R2R2 点击不能跳转到具体的布局,对于问题定位有很大的干扰
  • 不支持增量构建

对比一览

条目 ViewBinding DataBinding
定位 代替 findViewById 作为数据到界面显示的桥梁
是否需要更改布局 不需要 需要在最外围加上<layout>(可以自动生成)
能否进行数据绑定 不能 可以
能否和LiveData,ViewModel,LifeCycle 联动 不能 可以

ViewBinding 和 DataBinding

共同点

开启方法基本一致

都是在 gradle 配置开关
ViewBinding

android{
     viewBinding {
        enabled = true
     }
}

DataBinding

android{
     dataBinding {
        enabled = true
     }
}

对 View 操作基本一致

都是拿到 binding 对象,然后通过 binding 对象对 View 进行操作

private lateinit var binding: ResultProfileBinding

    @Override
    fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        binding = ResultProfileBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }

都是为了安全

  • Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用 @Nullable 标记。
  • 类型安全:每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。

不同点

定位不同

  • ViewBinding 定位代替 findViewById
  • DataBinding 定位是数据到界面展示的桥梁

可以直接看成 ViewBinding 是 DataBinding 的子集

对于 xml 要求不同

  • ViewBinding 不需要对 xml 进行更改
  • DataBinding 需要在 xml 最外层 加上 <layout> 这个根

DataBinding 多出来的功能

  • 布局中数据绑定
  • 能绑定 LiveDataViewModel 进行联动(生命周期监听)
  • 能直接扩展 View 的 XML 属性
  • 能直接绑定动作,例如 onClick,onLongClick 这些

Git 修改建议

如果要把一个类的大部分方法移动到一个新的类上,比如把 A 类的方法大部分移动到一个新的 B 类上,建议是把 A 重命名为 B ,然后把需要剩下的方法放在新建的 A 类上。目的是让大部分的方法追踪到 A 中,这样当 A 上有别人的修改,就能直接同步过去,不会造成特别大的冲突。

需要注意,新建的 A 不能被 Git 识别为旧的 A ,不然是会被追踪过去的。因为 Git 采用的是内容推断是否移动,如果你有比较大的修改,大概率不会被推断成旧的 A

Groovy Zip 文件

new File(sourceZipPath).eachFile() { file ->
    println "开始处理文件 ${file.name}"
    if (file.isFile()) {
        if (file.name.endsWith(".apk")) {
            // 为 apk 生成注释文件
            def fileSize = String.format("%.2f", file.size() / 1024 / 1024)
            comment.append("文件: ${file.name}\n")
                    .append("大小:  ${fileSize} MB\n")
                    .append("MD5: ${file.getBytes().md5()}\n")
                    .append("\n")
        }
        zipFile.putNextEntry(new ZipEntry(file.name))
        zipFile.write(file.getBytes())
        zipFile.closeEntry()
    }
}
println "注释信息为:\n $comment"
zipFile.comment = comment
zipFile.close()

如何在 iPad上用 Apple Pencil 代替键盘

使用步骤

1. 你要是 iOS 13

因为只有 iOS 13 才开始支持键盘的浮动模式。如果不开启浮动模式的话,其实也可以,前提你能忍,就是会像下图那样占用半个屏幕

这样其实也有一个问题,就是容易误触。

2. 开启浮动模式

开启方法很简单,看到大键盘,两个手指捏一下即可
变化动图
然后我们就可以用笔愉快的玩耍了

为什么要用笔

  1. 买了不能吃灰
  2. 经常使用键盘的拼音已经开始忘字了
  3. 有时候笔更方便携带

对比几款虚拟键盘

讯飞,百度,搜狗都对比过,输入体验最好的还是苹 原生体验最好,不信可以自己体验一下。

缺点

比较费电

ipad是支持120帧率的,这个东西就是为了让你在用笔输入的时候准备的,这样你就看不到笔输入带来的延时,但是也因为使用了高帧率所以用电也增加了很多

比较累

手写是没有笔输入快的,这点是肯定的。