我正在尝试开发我的第一个RxJava例子
我有一个带有文本框和三个按钮的主要活动。第一个按钮初始化单独类中的整数。第二个按钮订阅一个可观察量,该可观察量假定正在观察整数。第三个按钮将整数的值减小 1。
这是我的密码
package com.someurl.www.myobservable;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
public class MainActivity extends ActionBarActivity {
TextView tvDisplay;
Button btnInitialze;
Button btnSubscribeClass;
Button btnChangeInt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvDisplay = (TextView)findViewById(R.id.textView);
btnInitialze = (Button)findViewById(R.id.btnInitialize);
btnSubscribeClass = (Button)findViewById(R.id.btnSubscribeClass);
btnChangeInt = (Button)findViewById(R.id.btnChangeInt);
btnInitialze.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myObserve.InitializeBigInt(6);
}
});
btnSubscribeClass.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//subClassNow();
subJust();
}
});
btnChangeInt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int myNewInt = myObserve.DecreaseBigInt();
tvDisplay.append("\nFrom Button " + String.valueOf(myNewInt));
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
Observable<String> mObservable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello, World!");
subscriber.onCompleted();
}
});
public void subNow() {
mObservable.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
tvDisplay.append("\nDone!");
}
@Override
public void onError(Throwable e) {
tvDisplay.append("Error! \n" + e.getMessage());
}
@Override
public void onNext(String s) {
tvDisplay.append(s);
}
});
}
private void subClassNow() {
myObserve.mObservableClass.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
tvDisplay.append("\nClass Done!");
}
@Override
public void onError(Throwable e) {
tvDisplay.append("Class Error! \n" + e.getMessage());
}
@Override
public void onNext(Integer myInt) {
tvDisplay.append("\nClass " + String.valueOf(myInt));
}
});
}
private void subJust() {
myObserve.newObservableClass.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
tvDisplay.append("\nClass Done!");
}
@Override
public void onError(Throwable e) {
tvDisplay.append("Class Error! \n" + e.getMessage());
}
@Override
public void onNext(Integer myInt) {
tvDisplay.append("\nClass " + String.valueOf(myInt));
}
});
}
}
和班级
package com.someurl.www.myobservable;
import rx.Observable;
import rx.Subscriber;
/**
* Created by Admin on 6/21/15.
*/
public class myObserve {
static Integer myBigInt;
public static Observable<Integer> mObservableClass = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(myBigInt);
//subscriber.onCompleted();
}
});
public static void InitializeBigInt(Integer myInt){
myBigInt = myInt;
}
public static Integer DecreaseBigInt(){
myBigInt --;
return myBigInt;
}
public static Observable<Integer> newObservableClass = Observable.just(myBigInt);
}
当我尝试使用 mObservableClass
订阅时,它只是给了我 myBigInt
的值(即 6),然后它给了我完成
完成!
然后我尝试使用新的可观察类
,认为我需要使用,只是而不是.create
,但后来我得到了一个返回的空的myBigInt
,然后再次完成
完成!
有人能帮助我从正确的方向开始观察myBigInt
的值变化吗。理想情况下,我希望观察myBigInt的值,直到它减少到零(0),然后在零时调用完成!
谢谢,约翰
通常,您希望使用行为主题
来存储您的值并传达对其所做的更改。但是,您似乎也需要原子递减功能。试试这个:
public class AtomicBehaviorSubject {
private static final AtomicInteger value = new AtomicInteger();
private static final Subject<Integer, Integer> setter =
BehaviorSubject.<Integer>create().toSerialized();
public static void setValue(int newValue) {
value.set(newValue);
setter.onNext(newValue);
}
public static void decrementValue() {
for (;;) {
int curr = value.get();
if (curr == 0) {
return;
}
int u = curr - 1;
if (value.compareAndSet(curr, u)) {
if (u == 0) {
setter.onCompleted();
} else {
setter.onNext(u);
}
return;
}
}
}
public static Observable<Integer> valueChanged() {
return setter;
}
}
在android 6.0.1 Samsung s6 Edge+上的测试 当device screen脱机并从debug中拔出时,可观察到的只是停止发射项目。如果设备打开,则开始发射对象。另一个问题是,在停止接收项目之前,我会按照相同项目的顺序随机地得到2/3个重复调用 ____________________________edit_________________________________
我做了一个RxJava2实验,包括以下步骤: 从对象列表创建一个可观察对象。 使用EquiMapSing()将可观察对象发出的每个项目映射到SingleSource。在平图单()中,对可观察对象发出的每个项目执行异步操作。 收集ListB中的所有项目,使用Observable.toList() 结果:由于异步操作,ListB的项目顺序与ListA不同。 因此,flatMapSingle()的工作原
问题内容: 给定汽车清单(),我可以这样做: 有没有办法我可以从一个到一个序列? 像没有参数的东西 问题答案: 您可以这样映射到: 请注意,flatMapping可能不会保留源可观察的顺序。如果订单对您很重要,请使用。
我正在从事一个涉及Hystrix的项目,我决定使用RxJava。现在,忘记Hystrix的其余部分,因为我相信主要问题是我完全搞砸了正确编写可观察代码。 需要:我需要一种方法来返回一个代表多个可观察对象的可观察对象,每个可观察对象都运行一个用户任务。我希望该可观察对象能够返回任务的所有结果,甚至错误。 问题:可观测流会因错误而消亡。如果我有三个任务,而第二个任务引发了一个异常,那么即使第三个任务成
假设我有一个返回列表的博客帖子api 从列表创建可观察 将每个可观察拆分为
我在创建一个将返回对象列表的可观察对象时遇到了麻烦。我有一个ID列表,想对我的数据库提出一个请求。在这种情况下,我使用的是Firebase。当得到一个结果时,我希望将这些对象中的每一个编译成一个列表,然后返回该列表。我需要在返回之前等待所有的对象都返回。我在我的视图模型反序列化器类中这样做。这是我的代码。 有几种方法可以从firebase数据库中返回数据,我可以返回Documentsnapshot