Johnny Shieh

人如果没有梦想,跟咸鱼有什么分别


  • 首页

  • 分类

  • 归档

  • 标签

  • 读书

  • 小伙伴

  • 关于

  • 搜索

Dagger 2 完全解析(一),Dagger 2 的基本使用与原理

发表于 2017-05-22 | 分类于 Android | 0 | 阅读次数

Dagger 2 完全解析系列:

Dagger 2 完全解析(一),Dagger 2 的基本使用与原理

Dagger 2 完全解析(二),进阶使用 Lazy、Qualifier、Scope 等

Dagger 2 完全解析(三),Component 的组织关系与 SubComponent

Dagger 2 完全解析(四),Android 中使用 Dagger 2

Dagger 2 完全解析(五),Kotlin 中使用 Dagger 2

Dagger 2 完全解析(六),dagger.android 扩展库的使用

本系列文章是基于 Google Dagger 2.11-rc2 版本

依赖注入

什么是依赖

如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。例如 Man 中有用到一个 Car 对象,即 Man 对 Car 有一个依赖。

1
2
3
4
5
6
7
public class Man {
Car car;
public Man() {
car = new Car();
}
...
}

上面这种写法是最常见的写法,但是在下面几个场景中存在一些问题:

  1. 如果要修改 Car 的构造函数,例如需要使用car = new Car(name)的方式构造时,还要修改 Man 的代码;

  2. 如果想测试不同的 Car 对 Man 的影响会很困难,例如单元测试中使用 mock 的 car 测试 Man。

什么是依赖注入

阅读全文 »

Headless Fragment 监听 Activity 或 Fragment 生命周期

发表于 2017-04-15 | 分类于 Android | 0 | 阅读次数

监听 Activity 或者 Fragment 的生命周期对于很多开发者来说是小菜一碟,重载onResume、onPause等方法就行了,的确很多时候这种方法就可以了。但是这种方法是侵入式的,需要修改 Activity 或者 Fragment 的实现,但有时我们不能修改它们的实现,例如第三方 SDK 需要监听宿主页面的生命周期,这时需要非侵入式的实现方法。

对于 Activity 来说,可以注册 Application.ActivityLifecycleCallbacks 回调来监听其生命周期。但是对 Fragment 又应该怎么办呢?

Headless Fragment 监听生命周期

Headless Fragment 是没有布局不可见的 Fragment。Fragment 是与相关的 FragmentManager 的组件的生命周期相关联的,例如 Activity 的 onPause 会引起其中 Fragment 的 onPause。因为 Headless Fragment 是不可见的,所以它可以用来监听 Activity 和 Fragment 的生命周期。

阅读全文 »

Web 唤起 Android app 的实现及原理

发表于 2017-03-30 | 分类于 Android | 0 | 阅读次数

最近在项目中遇到 web 唤起 Android app 的需求,实现很简单,简单记录下实现方式与背后原理。

实现

先不管唤起的原理,用一个简单的例子描述它的实现:

首先需要在 AndroidManifest.xml 中定义 scheme,scheme 不能和 http、https、ftp、sms、mailto 等已使用的相同。

阅读全文 »

[译] 理解 RxJava 中的 Single 和 Completable

发表于 2017-03-15 | 分类于 Android | 0 | 阅读次数

在大多数 RxJava 示例代码和教程中出现最为频繁的一个类 —— Observable,它是产生响应式编程魔力的关键。它的用法很简单,只需要跟踪 3 个事件 —— onNext,onError和onCompleted就可以应用上百个操作符来实现自己的表达式。那么为什么你还需要了解其他东西?

但是你仔细思考下,你真的需要每次都知道这 3 个事件吗?实际上,在大多数情况下并不需要。ReactiveX 文档中讲述的基本都是关于连续的事件流,因此我们经常忘记通常我们关心的只是监听单一事件或者只监听 completed or failed 事件。

在这种情况下我们应该考虑用 RxJava 的两个绝妙的设计 —— Single<T> 和 Completable,在分析两者之前,让我们先看看他们应用场景的示例。

本文中所有代码都是基于 RxJava 2.x ,不是 1.x 版本。如果你还没升级 RxJava 到最新的 2.x 版本,强烈建议你马上升级。

Single

在 Android 中使用 RxJava 最常见的场景就是网络请求,你可能使用 Retrofit 作为项目的 Http client。假设你有一个 GET HTTP 请求返回一些数据,同时使用 RxJavaAdapter 你大概会这么写:

1
2
3
4
5
public interface APIClient {
@GET("my/api/path")
Observable<MyData> getMyData();
}

上面的代码没什么问题,当调用它时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiClient.getMyData()
.subscribe(new Consumer<MyData myData>() {
@Override
public void accept(MyData myData) throws Exception {
// handle data fetched successfully
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception{
// handle error event
}
}, new Action() {
@Override
public void run() throws Exception {
// handle on complete event
}
});

仔细思考下,其实这个网络请求并不是一个连续事件流,你只会发起一次 Get 请求返回数据并且只收到一个事件。我们都知道这种情况下 onComplete 会紧跟着 onNext 被调用,那为什么不把它们合二为一呢?

阅读全文 »

RxJava 2 版本的 Rxbus

发表于 2017-03-10 | 分类于 Android | 0 | 阅读次数

基于 RxJava 的 RxBus 作为一种事件总线,相信许多人都了解一些,Square 的 Otto 也因此弃用,因为现在 RxJava 太火了,用它几行代码就可以写出事件总线。不过大家所熟悉的是基于 RxJava 1.x 版本的,2016 年十月底 RxJava 更新到 2.x 版本了,具体变化请看 What’s different in 2.0,下面总结下适合不同场景的 RxJava 2 版本的 RxBus 写法。

  • 没有背压处理(Backpressure)的 RxBus

  • 有背压处理的 RxBus

  • 有异常处理的 RxBus (订阅者处理事件出现异常也能继续收到事件)

阅读全文 »
1…789…16
Johnny Shieh

Johnny Shieh

我本微末,心向天空

76 日志
13 分类
43 标签
GitHub Weibo Gmail 简书
  • 热门系列
  • Dagger 完全解析(6)
  • AspectJ in Android(3)
  • Kotlin 写 Android 单元测试(4)
  • Kotlin 协程完全解析(5)
© 2015 - 2019 Johnny Shieh
访客数 12383 访问量 16169