例えば、このパターン、Network only。

ここでは、PositionalDataSource を拡張するが、他のタイプのDataSource拡張でも同じ。
compositeDisposable のように viewModelScope をはるばる持ってきたにもかかわらず、
class RemoteDataSource(
private val coroutineScope: CoroutineScope,
private val service: RemoteService,
private val s: String
) : PositionalDataSource<Item>() {
@ExperimentalCoroutinesApi
override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback<Item>) {
Timber.d("RemoteDataSource#loadInitial: ${Thread.currentThread().name}")
...
loadInitial() 内は、メインスレッドではなく、別スレッドで実行されている。
Timber.d("RemoteDataSource#loadInitial: ${Thread.currentThread().name}")
D/RemoteDataSource: RemoteDataSource#loadInitial: arch_disk_io_0
D/RemoteDataSource: RemoteDataSource#loadInitial: arch_disk_io_1
D/RemoteDataSource: RemoteDataSource#loadInitial: arch_disk_io_3
これらは、Android Architecture Component が作成した独自スレッド。
よって、同期なRetrofitの実行処理で良い、となる。
If I use enqueue with Retrofit 2.3 it will doesn't work but if i do a .execute() the LiveData is correctly triggered
Retrofit 2.3で、enqueue() を使用しても機能しませんが、execute() を実行するとLiveDataが正しくトリガーされます。
Android Paging Library LiveData> is triggered before the end of the api call
公式リファレンスにも記述はあるという。
To display data from a backend server, use the synchronous version of the Retrofit API to load information into your own custom DataSource object.
バックエンドサーバーからのデータを表示するには、同期バージョンのRetrofit APIを使用して、独自のカスタムDataSourceオブジェクトに情報をロードします。
Network only - Paging library overview
しかし、DiffUtilを使ったリフレッシュなアニメーションが実行されない。
「手間がかかる」でなく「沼にハマる」ことが最近は多くなった。
APIの仕様がおせっかいすぎやしないか。
しきいを下げようとして、余計に混乱させるばかり。
👉 あなたは Android Architecture Component をどう思いますか? 
👉 Fragment と Toolbar の歴史の話 - Qiita 