我一直在与谷歌的拱库一起工作,但是让测试变得困难的一件事就是合作PagedList.
对于此示例,我使用存储库模式并从API或网络返回详细信息.
所以在ViewModel中我调用了这个接口方法:
override fun getFoos(): Observable<PagedList<Foo>>
Run Code Online (Sandbox Code Playgroud)
然后,存储库将RxPagedListBuilder用于创建Observable类型为PagedList的类型:
override fun getFoos(): Observable<PagedList<Foo>> =
RxPagedListBuilder(database.fooDao().selectAll(), PAGED_LIST_CONFIG).buildObservable()
Run Code Online (Sandbox Code Playgroud)
我希望能够通过这些返回a的方法设置返回测试PagedList<Foo>.类似的东西
when(repository.getFoos()).thenReturn(Observable.just(TEST_PAGED_LIST_OF_FOOS)
Run Code Online (Sandbox Code Playgroud)
两个问题:
PagedList<Foo>?我的目标是以更加端到端的方式进行验证(例如确保在屏幕上显示正确的Foos列表).片段/活动/视图是PagedList<Foo>从ViewModel 观察的片段/活动/视图.
因此,我正在使用一个明确定义的API,旨在不返回有效负载主体DELETE和PUT操作.
这在Rx 0.X和Rx 1.x中是可接受的.现在我正在更新到Rx 2并且存在一个存在的危机,我应该如何处理空值.内容长度和正文当然是null,导致:
java.lang.NullPointerException: Null is not a valid element
at io.reactivex.internal.queue.SpscLinkedArrayQueue.offer(SpscLinkedArrayQueue.java:68)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.onNext(ObservableObserveOn.java:116)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onNext(ObservableSubscribeOn.java:63)
Run Code Online (Sandbox Code Playgroud)
在doOnNext中.
我见过很多人的建议Optional<>但是我也需要支持Java7以用于用例原因.我尝试了后端移植,但我无法让它工作.我也不想膨胀并为他们的版本导入Guava库.
我也注意到flatMap也可以帮我处理这个与地图相反的问题,而我正在阅读这些差异.
目前我有一个非常粗糙的OkHttp3拦截器,它将检查状态,检查有效负载是否为空,并添加错误的虚拟内容.
我也试过添加转换工厂.
任何人都可以提供建议并指导我正确的道路是什么?当然,API可以改变,但204不应该因为它的定义为HTTP状态代码而具有有效载荷.
compile('com.squareup.retrofit2:retrofit:2.1.0') {
exclude module: 'okhttp'
}
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
compile 'io.reactivex.rxjava2:rxjava:2.0.5'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'
Run Code Online (Sandbox Code Playgroud) 我正在适应Android的Kotlin和ConstraintLayouts.我正在尝试使用具有工具栏和底部导航视图的简单布局.
这是我当前的xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textColor="@android:color/white"
android:textSize="@dimen/toolbar_title_text_size"
android:textStyle="bold" />
</android.support.v7.widget.Toolbar>
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/colorAccent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar"
app:layout_constraintBottom_toTopOf="@id/bottom_navigation_view"/>
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:menu="@menu/menu_main" />
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
不幸的是,我误解了一些东西,似乎无法让片段容器填满工具栏和底部导航之间的空间.
有人能引导我朝正确的方向前进吗?
因此,我做了一些研究,似乎在init抽象基类的/构造函数中查看膨胀并不是真正的最佳实践。我明白这是因为基类初始值设定项发生在init派生类的 /构造函数之前。由于抽象类是非最终类,所以有一个关于块this中泄漏的不错的 IDE 消息init。
这就是我所追求的:
abstract class Foo @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {
private val myView: View
init {
// todo@patches fix leaking "this"
View.inflate(context, R.layout.view_foo, this)
myView = requireNotNull(findViewById(R.id.my_view))
}
}
Run Code Online (Sandbox Code Playgroud)
class Bar @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : Foo(context, attrs, defStyleAttr)
Run Code Online (Sandbox Code Playgroud)
我真的不想向派生类的 init 添加任何内容,或者创建myView稍后在抽象类中设置的可为空/可变变量。
还有其他人觉得这有点令人沮丧或有什么建议吗?似乎想要从基类膨胀相同的布局并不罕见。
android ×3
android-architecture-components ×1
android-view ×1
kotlin ×1
okhttp3 ×1
retrofit2 ×1
rx-java ×1