标签: rx-android

改造"IllegalStateException:已经执行"

我有一个Retrofit网络调用,id喜欢每5秒运行一次.我目前的代码:

Handler h = new Handler();
int delay = 5000; //milliseconds

h.postDelayed(new Runnable() {
    public void run() {
        call.enqueue(new Callback<ApiResponse>() {
            @Override
            public void onResponse(Response<ApiResponse> response) {
                Log.d("api", "response: " + response.body().getPosition().getLatitude().toString());
            }

            @Override
            public void onFailure(Throwable t) {

            }
        });
        h.postDelayed(this, delay);
    }
}, delay);
Run Code Online (Sandbox Code Playgroud)

这运行一次,但随后抛出以下内容:

java.lang.IllegalStateException:已经执行.at retrofit2.OkHttpCall.enqueue(OkHttpCall.java:52)at retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall.enqueue(ExecutorCallAdapterFactory.java:57)at orbyt.project.MyFragment $ 1.run(MyFragment.java:93)

这是什么问题?

作为奖励:什么是更好的方法来处理这个?我会在每次更新时更新地图.我正在考虑尝试使用Rx,但不确定这是否是一个合适的用例,或者如何实现它.

android retrofit okhttp rx-android retrofit2

23
推荐指数
1
解决办法
8231
查看次数

如何解决APK META-INF/rxjava.properties中复制的重复文件

我在我的android应用程序上使用rxjava和rxvolley.当我尝试运行它时,我收到此错误

Execution failed for task ':testapp:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/rxjava.properties
            File1: C:\Users\Daniel\.gradle\caches\modules-2\files-2.1\io.reactivex\rxjava\1.1.0\748f0546d5c3c27f1aef07270ffea0c45f0c42a4\rxjava-1.1.0.jar
            File2: C:\Users\Daniel\.gradle\caches\modules-2\files-2.1\io.reactivex.rxjava2\rxjava\2.0.3\d2f725668bd22e21170381b23f8fbdf72c69d886\rxjava-2.0.3.jar
Run Code Online (Sandbox Code Playgroud)

我有这样的exclude.gradle文件

android {
packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/rxjava.properties'
    exclude 'META-INF/rxjava.PROPERTIES'
    exclude 'META-INF/RXJAVA.properties'
    exclude 'META-INF/RXJAVA.PROPERTIES'
    exclude 'META-INF/rxjava'
    exclude 'META-INF/RXJAVA'
}

lintOptions {
    abortOnError false
}
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

android rx-java android-gradle-plugin rx-android

23
推荐指数
2
解决办法
1万
查看次数

rxjava在创建observable后添加项目

我刚开始使用rxjava而且卡住了.也许我没有以正确的方式使用rxjava,但我需要Observable在创建后添加项目.所以我理解你可以只是打电话Observable.just("Some", "Items"),订阅者会收到它们,但是如果我有一个异步任务,我需要在任务完成后再添加一些项目呢?我找不到类似的东西Observable.addItems("Some", "More", "Items")

asynchronous observable rx-java rx-android

22
推荐指数
1
解决办法
9456
查看次数

为什么在Android上使用Retrofit的RxJava doOnError()不起作用,但是Subscriber onError会起作用

谁能解释我为什么这样的代码:

 networApi.getList()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnError(throwable -> {
                throwable.getMessage();
            })
            .doOnNext(list -> {
                coursesView.populateRecyclerView(list);
                courseList = (List<Course>) courses;
            }).subscribe();
Run Code Online (Sandbox Code Playgroud)

如果没有互联网进入doOnError但是进一步抛出它以便应用程序关闭,但代码如下:

networkApi.getList()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<List<? extends Course>>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    e.getMessage();
                }

                @Override
                public void onNext(List<? extends Course> list) {
                    coursesView.populateRecyclerView(list);
                    courseList = (List<Course>) list;
                }
            });
Run Code Online (Sandbox Code Playgroud)

按照我的预期工作,这意味着当没有互联网连接时,它什么都不做.

android subscriber rx-java retrofit rx-android

22
推荐指数
1
解决办法
6044
查看次数

RxJava:如何使用zip操作符处理错误?

我正在使用RxJava和RxAndroid与Retrofit2.

Observable<ResponseOne> responseOneObservable = getRetrofitClient().getDataOne()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());

Observable<ResponseTwo> responseTwoObservable = getRetrofitClient().getDataTwo()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
Run Code Online (Sandbox Code Playgroud)

在上面两个Observer上使用如下的zip操作符.

 Observable<ArrayList<TestData>> testDataObservable = Observable.zip(responseOneObservable, responseTwoObservable, new Func2<ResponseOne, ResponseTwo, ArrayList<TestData>>() {
            @Override
                public ArrayList<TestData> call(ResponseOne responseOne, ResponseTwo responseTwo) {
                  ArrayList<TestData> testDataList = new ArrayList();
                      // Add test data from response responseOne & responseTwo
                  return testDataList;
            } 
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Subscriber<ArrayList<TestData>>() {

        @Override
        public void onNext(ArrayList<TestData> testDataList) {

        }

        @Override
        public void onCompleted() {
            Log.d(TAG, "onCompleted" );
        }

        @Override
        public void onError(Throwable t) {
            Log.d(TAG, "onError Throwable: …
Run Code Online (Sandbox Code Playgroud)

error-handling android rx-java rx-android retrofit2

21
推荐指数
1
解决办法
1万
查看次数

RxJava flatMapIterable with Single

我正在尝试整理我的代码,并且Single看起来对我来说是一个不错的选择,因为我正在做一些只能发出一个结果的东西.

我遇到了一个问题,因为我以前使用flatMapIterable我的回复(列表)并对每个项目做一些事情.我没有看到我如何用Single实现这个目标.

getListOfItems()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()
Run Code Online (Sandbox Code Playgroud)

如果能正常工作getListOfItems是返回一个Observable,但如果我试图使它返回Single,那么我不能这样做flatMapIterable,不能看到另一种,任何想法?

android rx-android rx-java2

21
推荐指数
3
解决办法
1万
查看次数

RxJava组合请求序列

问题

我有两个Apis.Api 1给了我一个项目列表,Api 2给了我更多关于我从Api获得的每个项目的详细信息.到目前为止,我解决它的方式导致性能不佳.

问题

在Retrofit和RxJava的帮助下,快速,快速地解决了这个问题.

我的方法

在片刻我的解决方案看起来像这样:

第1步:Single<ArrayList<Information>>从Api 1 执行Retrofit .

第2步:我遍历这些项目并向Api 2发出请求.

第3步:改造退货按顺序执行Single<ExtendedInformation>每个项目

步骤4:在完成Api 2的所有调用完成后,我为组合信息和扩展信息的所有项创建一个新对象.

我的守则

 public void addExtendedInformations(final Information[] informations) {
        final ArrayList<InformationDetail> informationDetailArrayList = new ArrayList<>();
        final JSONRequestRatingHelper.RatingRequestListener ratingRequestListener = new JSONRequestRatingHelper.RatingRequestListener() {
            @Override
            public void onDownloadFinished(Information baseInformation, ExtendedInformation extendedInformation) {
                informationDetailArrayList.add(new InformationDetail(baseInformation, extendedInformation));
                if (informationDetailArrayList.size() >= informations.length){
                    listener.onAllExtendedInformationLoadedAndCombined(informationDetailArrayList);
                }
            }
        };

        for (Information information : informations) {
            getExtendedInformation(ratingRequestListener, information);
        }
    }

    public void getRatingsByTitle(final JSONRequestRatingHelper.RatingRequestListener ratingRequestListener, final Information information) {
        Single<ExtendedInformation> …
Run Code Online (Sandbox Code Playgroud)

java android reactive-programming rx-java rx-android

21
推荐指数
2
解决办法
1万
查看次数

RxJava和RxAndroid之间的区别?

为什么我们需要将RxAndroid与RxJava一起使用?它们与RxAndroid和RxJava的实际使用之间有什么功能差异?我找不到合适的答案.

android reactive-programming rx-java rx-android

21
推荐指数
2
解决办法
4763
查看次数

在后台线程上处理Observable

我正在使用RxAndroid进行流操作.在我的实际用例中,我从服务器获取列表(使用Retrofit).我正在使用调度程序在后台线程上完成工作,并在Android UI(主)线程上获得最终发射.

这适用于网络调用,但是我意识到网络调用后我的运算符不使用后台线程,而是在主线程上调用.

myService.fetchSomeIntegersFromServer()
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .filter(integer -> {
            System.out.println(Looper.getMainLooper().getThread() == Thread.currentThread());
            return true;
        })
        .subscribe(integer1 -> {});
Run Code Online (Sandbox Code Playgroud)

如何确保所有操作都在后台线程上执行?

rx-java rx-android

20
推荐指数
1
解决办法
2万
查看次数

Rx Java mergeDelayError无法按预期工作

我在RxAndroid中使用RxJava和Android应用程序.我正在使用mergeDelayError将两个逆向拟合网络调用组合成一个observable,如果发出一个,它将处理发出的项目,如果有的话,则处理错误.这不起作用,它只会在遇到错误时触发onError操作.现在为了测试这个我转移到一个非常简单的例子,当我有一个onError调用时,仍然不会调用successAction.见下面的例子.

Observable.mergeDelayError(
                Observable.error(new RuntimeException()),
                Observable.just("Hello")
            )
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .finallyDo(completeAction)
            .subscribe(successAction, errorAction);
Run Code Online (Sandbox Code Playgroud)

只有在使用两个成功的可观察对象时才会调用成功操作.我错过了mergeDelayError应该如何工作的东西?

编辑:

我发现,如果我删除了observeOn,subscribeOn一切都按预期工作.我需要指定线程和思想,这是使用Rx的重点.知道为什么指定那些Schedulers会破坏行为吗?

java android rx-java rx-android

19
推荐指数
2
解决办法
3873
查看次数