我在我的应用程序中使用 Retrofit 2 和 rxjava 2。这些是我的 gradle 实现:
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.4.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
Run Code Online (Sandbox Code Playgroud)
这是我的 API 连接类:
public class ApiConnection {
private static String BaseUrl = "http://mysites.com/";
private static Retrofit retrofit = null;
public static Retrofit getClient() {
Gson gson = new GsonBuilder()
.setLenient()
.create();
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BaseUrl)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
return retrofit;
}
}
Run Code Online (Sandbox Code Playgroud)
我在这一行遇到错误:
RxJava2CallAdapterFactory
Run Code Online (Sandbox Code Playgroud)
这是错误:
Cannot resolve symbol 'RxJava2CallAdapterFactory
Run Code Online (Sandbox Code Playgroud)
我的代码有什么问题吗?
在 Room 数据库中,我想添加一些观察者,其中的通知如下:删除、插入、更新。
我确实通过创建一个接口来实现这一点,然后适配器实现它。因此,每次一个数据库事务结束时,都会在适配器上执行一次匹配操作。
但我不确定这是否是正确的方法,也许 rxjava 有某种方法可以做到这一点?或者也许是 RecyclerView 中的 DiffUtil?
我想通过改造和 rxjava 连接到服务器。当我使用 call 时它可以工作,一切都很好。但是当尝试使用 rxjava 时,它会遇到麻烦。错误文本:
无法找到 io.reactivex.Single 的调用适配器
在 build.gradle 中我实现了改造适配器。但我不知道问题是什么。这是我的等级:
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation "android.arch.persistence.room:runtime:1.1.1"
annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
Run Code Online (Sandbox Code Playgroud)
api客户端代码:
public class ApiClient {
public static final String BASE_URL="http://192.168.1.100/digikala/";
private static Retrofit retrofit=null;
public static Retrofit getClient(){
if(retrofit==null){
retrofit=new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(BASE_URL)
.build();
}
return retrofit;
}
Run Code Online (Sandbox Code Playgroud)
api服务代码:
public interface ApiService {
@GET("readamazing.php")
Single<List<Product>> getSingleProducts();
}
Run Code Online (Sandbox Code Playgroud)
主要活动代码:
ApiService apiService=ApiClient.getClient().create(ApiService.class);
apiService.getSingleProducts().subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<List<Product>>() {
@Override
public void …
Run Code Online (Sandbox Code Playgroud) 错误:任务':app:transformResourcesWithMergeJavaResForDebug'的执行失败.
com.android.build.api.transform.TransformException:com.android.builder.packaging.DuplicateFileException:在APK META-INF/rxjava.properties中复制的重复文件File1:D:\ Android\Android Studio\gradle\caches\modules- 2\files-2.1\io.reactivex.rxjava2\rxjava\2.0.2\cfccdd18cdfbe7b4773d42c9f3512eeafbe5cbf9\rxjava-2.0.2.jar File2:D:\ Android\Android Studio\gradle\_caches\modules-2\files-2.1\io .reactivex\rxjava\1.2.1\4e4cfa4adc74521d5966799fa5ab70b733552f68\rxjava-1.2.1.jar
我正在尝试使用一个缓冲区,在rxjava中打开和克隆边界,但我无法让它工作.我想做的是假设一个可观察的发射,0,1,2,3,0,1,3,0,3我想以{0,1,2,3},{0,1结束,3},{0,3}.
这是我到目前为止的代码:
PublishSubject openning = PublishSubject.create();
openning.doOnNext(new Consumer() {
@Override
public void accept(@NonNull Object o) throws Exception {
if(o.equals("0"))
openning.onNext(o);
}
});
Observable<String> observableA = Observable.interval(1, TimeUnit.SECONDS).map(value -> String.valueOf(value % 10));
observableA.subscribe(openning);
// TODO: Buffer by boundary
observableA = observableA.buffer(openning, new Function<String, Observable<List<String>>>() {
@Override
public Observable<List<String>> apply(@NonNull String o) throws Exception {
list.add(o);
if (o.equals("0")) {
return Observable.just(list);
} else {
list.add(o);
sb.append(o);
return Observable.never();
}
}
}, new Callable() {
@Override
public Object call() throws Exception {
return …
Run Code Online (Sandbox Code Playgroud) 我正在使用 WorkManager (Android Jetpack) 和 Rx 开发一个 Android 应用程序。下面是 Worker 类。
class ImageRxWorker(
appContext: Context,
private val workerParams: WorkerParameters
) : RxWorker(appContext, workerParams) {
override fun createWork(): Single<Result> = Single.create<Result> { emitter -
// do the job
emitter.onSuccess(Result.success())
}
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,没有问题。但我想知道的是我该如何处理结果?
class MainPresenter(
private val view: MainActivity,
private val workManager: WorkManager = WorkManager.getInstance()
) : MainContract.Presenter {
override fun startWork(): Completable {
view.showToastMessage(R.string.worker_started)
return Completable.create { emitter ->
val uploadWorkRequest = OneTimeWorkRequestBuilder<ImageRxWorker>().build()
workManager.enqueue(uploadWorkRequest)
emitter.onComplete() // This is not exit immediately. …
Run Code Online (Sandbox Code Playgroud) 所以..想象我有一个像这样的方法构造:
LocalDatabase:
public Observable<PoiObject> getPoiObject() {
return Observable.defer {
PoiObject object = poiDao.getPoiObject();
if(object == null) {
return Observable.empty();
}
else {
return Observable.just(object);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我在其他地方有另一种方法,如下所示:
服务:
public Observable<PoiObject> getPoiObject() {
return localDatabase.getPoiObject()
}
public Observable<PoiObject> getItFromWeb() {
return restService.getObject()
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试将Service :: getPoiObject的调用链接到这样的Rx调用:
用例:
public Observable<SomeVM> getObject() {
return service.getPoiObject()
.switchIfEmpty(service.getItFromWeb())
}
Run Code Online (Sandbox Code Playgroud)
然后以下单元测试失败:
@Test
public void test_getObject() {
Service service = mock()
when(service.getPoiObject()).thenReturn(any());
Observable<SomeVM> observable = usecase.getObject();
verify(service).getPoiObject();
verify(service, times(0)).getItFromWeb();
}
Run Code Online (Sandbox Code Playgroud)
为什么getItFromWeb()在清楚地执行时,前一个调用不为空(从service.getPoiObject()调用返回对象).是否还有其他策略可以测试switchIfEmpty?
我正在使用Rxjava2,
我flatmap
在RxJava中使用以下结构:
Observable1.flatmap()
并返回Observable 2.
如下代码:
getApi().createUser(os, deviceToken)
.compose(view.regisObserver())
.subscribeOn(Schedulers.io())
.flatMap(result -> {
String user_token = result.data.user_token;
getPreferenceStore().setAuthToken(user_token);
setReadPolicy();
Observable<ObjectDto<UserProfile>> obs = getApi().updateProfile(null, null, null);
obs.compose(view.regisObserver());
return obs;
})
.subscribe(result-> {
getPreferenceStore().setUserId(result.data.user_id);
// view.onUpdateProfile();
}, Throwable::printStackTrace);
@Override
public <T> ObservableTransformer<T, T> regisObserver() {
return observable -> observable.compose(prepare())
.doOnSubscribe(disposable -> showProgressDialog())
.doOnComplete(this::closeProgressDialog)
.doOnError(throwable -> {
if (BuildConfig.DEBUG) {
throwable.printStackTrace();
}
showProgressDialog();
closeProgressDialog();
});
}
Run Code Online (Sandbox Code Playgroud)
代码编译没有错误.它在运行时出错NetworkErrorOnMainThread
.我不知道如何解决它.
rx-java2 ×8
android ×6
java ×3
rx-java ×3
kotlin ×2
observable ×2
retrofit2 ×2
android-room ×1
reactive ×1