Android RxJava:在onComplete

时间:2015-06-25 12:25:22

标签: android rx-java

我有一个名为PendingRequests的班级。这个班级基本上是Volley Requests的反击。我有两个Volley方法 - 一个叫CheckOpen,一个叫CheckCompleted。每种方法都会在我的SQLite平板电脑数据库中选择“打开”或“已完成”记录,并针对服务器进行检查。

CheckOpenCheckClose中,我使用了三次PendingRequests来电。一开始我拨打Initialize(),然后当我向队列添加一个截击请求时,我呼叫Add()然后当我开始接收响应时,我呼叫Subtract()。对于CheckOpenCheckClose,我会很快Add()达到50,然后慢慢倒计时(Subtract())回零。

一旦我倒数到零,我就拨打onComplete

以下是PendingRequests的代码

import rx.Observable;
import rx.subjects.PublishSubject;
import rx.subjects.Subject;

/**
 * Created by Admin on 6/17/15.
 */
public class PendingRequests {
    private static Integer pendingReq;
    private static Subject<Integer, Integer> pendingObser = PublishSubject.create();

    public static void Initialize(Integer myInt) {
        pendingReq = myInt;
        pendingObser.onNext(pendingReq);
    }

    public static void Add() {
        pendingReq ++;
        pendingObser.onNext(pendingReq);
    }

    public static void Subtract() {
        if (pendingReq == 0) {
            return;
        }
        else
        {
            pendingReq --;
            if (pendingReq == 0) {
                pendingObser.onCompleted();
            }
            else {
                pendingObser.onNext(pendingReq);
            }

        }
    }

    public static Integer Current() {
        // return the current value of pendingReq for testing purposes
        return pendingReq;
    }

    public static Observable<Integer> valueChanged() {
        return pendingObser;
    }
}

因此,PendingObser以上是主题,valueChanged是观察者。 (希望我理解正确)。

在我MainActivity我有两个按钮。每个按钮旁边都有textview,显示来自pendingObser的值。

以下是我的两个按钮的代码

public void checkComplete(View view) {
    //Intent intent = new Intent(this, ResendActivity.class);
    //startActivity(intent);
    PendingRequests.valueChanged().subscribe(new Subscriber<Integer>() {
        @Override
        public void onCompleted() {
            tvPendingTotalClosed.setText("Done");
            System.gc();
        }

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

        @Override
        public void onNext(Integer integer) {
            tvPendingTotalClosed.setText(String.valueOf(integer));
        }
    });
    String myResult = seWebServiceUtils.checkCompletedRecord();
    Toast.makeText(ApplicationController.getContext(), myResult, Toast.LENGTH_LONG).show();
}

public void checkOpen(View view){
    // called directly from button btnCheckOpen
    PendingRequests.valueChanged().subscribe(new Subscriber<Integer>() {
        @Override
        public void onCompleted() {
           tvPendingTotalOpen.setText("Done");
            System.gc();
        }

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

        @Override
        public void onNext(Integer integer) {
            tvPendingTotalOpen.setText(String.valueOf(integer));
        }
    });
    String myResult = seWebServiceUtils.checkOpenRecord();
    Toast.makeText(ApplicationController.getContext(), myResult, Toast.LENGTH_LONG).show();
}

我有两个问题:

  1. 当我致电checkComplete时,它会按预期执行,并以tvPendingTotalClosed中的单词Done结束。但是,当我点击checkOpen时,tvPendingTotalClosedtvPendingTotalOpen倒计时。所以checkComplete不是取消订阅

  2. 第一次按下按钮后,如果我第二次按下按钮CheckOpenRecords则没有任何反应。这就像我不能再次订阅PendingRequests

  3. 谢谢,约翰

0 个答案:

没有答案