RxJava和Android:如何使用cache()使observable无效?

时间:2016-09-06 08:10:43

标签: android caching rx-java retrofit2 rx-android

我有一个使用RxJava和Retrofit2加载数据的Activity。为防止每次配置更改时触发请求,我使用cache()运算符。这很好用,我可以看到请求只进行一次。问题是我不时需要提出新的请求以获取新数据。换句话说,我需要使缓存无效。我怎么能这样做?

活动正在使用存储库发出请求:

public class Repository {
private final PlaceholderApi api;
private Observable<List<Post>> obs;
private static Repository inst;

public static Repository instance() {
    if (inst == null) {
        inst = new Repository();
    }
    return inst;
}

private Repository() {
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor(message -> System.out.println(message));
    logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
    OkHttpClient okhttp = new OkHttpClient.Builder()
            .addInterceptor(logging)
            .build();
    Retrofit retrofit = new Retrofit.Builder()
            .client(okhttp)
            .addConverterFactory(MoshiConverterFactory.create())
            .baseUrl("http://jsonplaceholder.typicode.com/")
            .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()))
            .build();
    api = retrofit.create(PlaceholderApi.class);
}

public Observable<List<Post>> getAll() {
    if (obs == null) {
        obs = api.getPosts().cache();
    }
    return obs;
}
}

活动代码:

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";
private Subscription sub1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sub1 = Repository.instance().getAll().subscribe(/* handle posts list */);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (sub1 != null && !sub1.isUnsubscribed()) {
        sub1.unsubscribe();
    }
}
}

2 个答案:

答案 0 :(得分:1)

以下是使用Dave Moten的回答 - https://stackoverflow.com/a/31738646/6491552的OnSubscribeRefreshingCache包装类与您的代码进行的示例:

invalidateCache()

然后在其中一个Activity生命周期方法中调用/etc/hosts.allow方法或任何适合您的方法。

答案 1 :(得分:0)

解决问题的另一种方法是使用OperatorFreeze(没有运营商缓存),如果您使用持久性演示者。此配置发生更改时,此运算符可以暂停Observable,并在重新创建活动时恢复它。您也不需要将Observable存储在存储库中。