技术小黑屋

RxHttp 一款让你眼前一亮的 Http 请求框架

本文系 RxHttp作者不怕天黑 向本博客投稿,并授权在本站发表。

1、前言

RxHttp在今年4月份一经推出,就受到了广大Android 开发者的喜爱,截止本文发表在github上已有1100+star,为此,我自己也建个RxHttp&RxLife 的群(群号:378530627)目前群里也有将近120号人,里面有不少小伙伴提了很多有价值的创意,才使得RxHttp一直坚持走到了现在,在此,感谢大家的喜爱。

终端依赖者福利:终端也能实现翻译功能了

一直是终端重度依赖,现在发现了一个终端翻译的工具,更加爱不释手。本文介绍一下一个终端可以实现的工具,trans。

是什么

Command-line translator using Google Translate, Bing Translator, Yandex.Translate, etc

一个终端翻译工具,利用Google翻译,Bing翻译,Yandex翻译等。

Mac 下在终端直接查看图片

在开发的过程中,我们通常会遇到这样的情况,就是我们需要根据图片的url地址查看其对应的内容,通常的做法就是把这个图片链接贴到浏览器。不过一直好奇,能不能再终端中直接展示,于是做了一些搜索,发现了对应的实现方式。

注意:此方式只适用于Mac,其他的Linux 发行版 需要自行按照如下的思路查找对应的工具。

在 Android 中如何确定 App(Activity) 的启动者

最近在帮忙定位一个问题,涉及到某个应用自动启动了,为了确定是谁调用的,使用如下的日志进行查看(注:为了简单考虑,下面的启动者为launcher)

1
2
3
4
(pre_release|✔) % adb logcat | grep -E "ActivityManager: START" --color=always
I ActivityManager: START u0 {act=android.intent.action.MAIN
cat=[android.intent.category.HOME] flg=0x10000000 hwFlg=0x10
cmp=com.huawei.android.launcher/.unihome.UniHomeLauncher (has extras)} from uid 10070

这可能是最好的 Android/Kotlin日志输出方法

在编程调试和定位问题的时候,日志是一个最常用的工具。比如输出一些信息,确定执行轨迹。今天我们这里简单聊一聊打印日志的一些分析。

通常,我们进行日志输出的时候都会限定在debug包下执行,对于非debug包,我们就不输出日志。那么如果是非debug,不同的日志输出方式可能存在一定的性能问题,本文将通过几个版本来对比着方面的差异。

简简单单对比encodeURI与encodeURIComponent

encodeURI和encodeURIComponent 是两个很相近的方法,用来encode URI。但是他们之间也存在着细微的差异,如果不能很好的理解这个差异,可能会导致一些不必要的麻烦。本文将尝试用最简单的形式展示这个差异。

GapWorker导致RecyclerView视频播放声音残留问题

场景描述

  • App 有两个tab,每一个都是Fragment,以FragmentA和FragmentB 代称.
  • 切到FragmentA 视频播放(在RecyclerViewA 内部),然后切到FragmentB 视频暂停.
  • 就在此刻,滑动FragmentB 的recyclerView B ,来自FragmentA的视频播放出声音,而且声音是下一条视频的声音。

在终端使用脚本查看网站 SSL 证书信息

之前遇到过一次赛门铁克很久的证书被Chrome弃用的问题,涉及到了查看证书。当然第一个大家会想到的是在浏览器中查看,但是总是感觉不够极客。后来摸索找到了终端查看网站证书的方法

使用脚本批量替换文本内容

很多时候,我们需要进行多个文件的查找并替换,虽然IDE有这样的可视化功能,但是偏爱终端的人还是想要尝试用脚本实现一把。如下是一个简单的脚本来实现多文件的查找替换处理。

一个小技巧提升 OkHttp 请求稳定性

OkHttp是可以说是Android开发中,每个项目都必需依赖的网络库,我们可以很便捷高效的处理网络请求,极大的提升了编码效率。但是有时候,我们使用OkHttp也会遇到这样的问题

崩溃的stacktrace

1
2
3
4
5
6
7
8
9
10
11
 E AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
 E AndroidRuntime: Process: com.example.okhttpexceptionsample, PID: 13564
 E AndroidRuntime: java.lang.NullPointerException: blablabla
 E AndroidRuntime:    at com.example.okhttpexceptionsample.MainActivity$createNPEInterceptor$1.intercept(MainActivity.kt:61)
 E AndroidRuntime:    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
 E AndroidRuntime:    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
 E AndroidRuntime:    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:184)
 E AndroidRuntime:    at okhttp3.RealCall$AsyncCall.run(RealCall.kt:136)
 E AndroidRuntime:    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
 E AndroidRuntime:    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
 E AndroidRuntime:    at java.lang.Thread.run(Thread.java:784)

根据包名查找 Jar 包文件

很多时候,我们需要根据包名来查找一些依赖所在的jar包,比如我们想要查找com.alipay这个包及其文件所在的jar包。

最笨拙的办法可能是这样

  • 一个一个jar包查找,再利用一些工具来验证。

其实,大可不必,我们需要简单实用如下的脚本就能解决这个问题。

解决 Grep 的多次管道过滤问题

在日常的开发过程中,我们利用grep可以方便快捷的查找感兴趣的日志内容,极大地提升了开发和排错效率。但是有时候,我们也会遇到一些问题,比如。

JvmName 注解在 Kotlin 中的应用

JvmName注解是Kotlin提供的一个可以变更编译器输出的注解,这里简单的介绍一下其使用规则。

应用在文件上

未应用@JvmName

1
2
3
4
5
6
7
8
package com.example.jvmannotationsample

import android.net.Uri


fun String.toUri(): Uri {
    return Uri.parse(this)
}

Contract,开发者和 Kotlin 编译器之间的契约

相比 Java,使用 Kotlin 编程的时候,我们和kotlin编译器的交互行为会更多一些,比如我们可以通过inline来控制字节码的输出结果,使用注解也可以修改编译输出的class文件。

这里介绍一个和kotlin编译器更加好玩的特性,contract。可以理解成中文里面的契约。

简单几招提速 Kotlin Kapt编译

应用Kotlin之后,涉及到注解的注解处理器依赖也会由annotationProcessor替换成kapt,和最初应用Kotlin一样,总会让人一种感觉,一番应用Kotlin和Kapt之后,编译耗时更长了,不过好在Kotlin和Google 在这一方面做了很多的优化和改进,本文将简单介绍一些配置,来实现项目编译关于kapt这方面的加速。

Kotlin编译与Intrinsics检查

在很早的时候,小黑屋就介绍过如何研究Kotlin,其中涉及到了查看字节码和反编译成Java代码的方式,相信很多人研究过的人,都会或多或少遇到过Intrinsics.checkParameterIsNotNull这样或者类似的代码。

Kotlin编译调校之WarningsAsErrors

这之前的文章中,我们介绍过如果通过Kotlin编译器参数实现将所有的warnings按照errors对待,主要的实现方法是这样

1
2
3
4
//Code to be added
kotlinOptions {
    allWarningsAsErrors = true
}

使用Kotlin Reified 让泛型更简单安全

我们在编程中,出于复用和高效的目的,我们使用到了泛型。但是泛型在JVM底层采取了类型擦除的实现机制,Kotlin也是这样。然后这也带来了一些问题和对应的解决方案。这里我们介绍一个reified用法,来实现更好的处理泛型。

为 Kotlin 项目设置编译选项

经常用终端的人都知道,终端命令有很多选项可以指定,这里我们以相关的kotlinc为例,我们可以在终端这样指定选项

1
2
3
4
5
kotlinc -Werror ./app/src/main/java/com/example/compileroptionssample/Simple.kt
error: warnings found and -Werror specified
app/src/main/java/com/example/compileroptionssample/Simple.kt:4:19: warning: unnecessary safe call on a non-null receiver of type String
    println(string?.toString())
                  ^

一个查找字节码更好研究Kotlin的脚本

众所周知,Kotlin通过语法糖的形式实现了很多便捷和高效的方法,因此研究Kotlin代码通常是需要研究字节码或者反编译后的java文件。

比如这样的代码

1
2
3
fun String.toConsole() {
    println(this)
}

修复应用无法通过App Store升级的问题

之前遇到过这样的问题

  • 从微信官网下载微信Mac版安装
  • 后来App Store提示有新的微信更新
  • 但是每次打开都是这样的画面,提示上一个账户(主动更换过账户)的信息
  • 而且上一个账户基本弃用,但是也无法使用当前账户更新

未关闭的文件流会引起内存泄露么?

最近接触了一些面试者,在面试过程中有涉及到内存泄露的问题,其中有不少人回答说,如果文件打开后,没有关闭会导致内存泄露。当被继续追问,为什么会导致内存泄露时,大部分人都没有回答出来。

本文将具体讲一讲 文件(流)未关闭与内存泄露的关系。