我有一个名为PendingRequests
的班级。这个班级基本上是Volley Requests的反击。我有两个Volley方法 - 一个叫CheckOpen
,一个叫CheckCompleted
。每种方法都会在我的SQLite平板电脑数据库中选择“打开”或“已完成”记录,并针对服务器进行检查。
在CheckOpen
和CheckClose
中,我使用了三次PendingRequests
来电。一开始我拨打Initialize()
,然后当我向队列添加一个截击请求时,我呼叫Add()
然后当我开始接收响应时,我呼叫Subtract()
。对于CheckOpen
或CheckClose
,我会很快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();
}
我有两个问题:
当我致电checkComplete
时,它会按预期执行,并以tvPendingTotalClosed
中的单词Done结束。但是,当我点击checkOpen
时,tvPendingTotalClosed
和tvPendingTotalOpen
倒计时。所以checkComplete
不是取消订阅
第一次按下按钮后,如果我第二次按下按钮CheckOpenRecords
则没有任何反应。这就像我不能再次订阅PendingRequests
。
谢谢,约翰