我意识到我在MainThread上使用了subscribeOn()/ observeOn()。 我可以传递给subscribeOn()的选项有哪些? 我可以将哪些选项传递给observeOn()?
12-17 21:36:09.154 20550-20550/rx.test D/MainActivity2: [onCreate]
12-17 21:36:09.231 20550-20550/rx.test D/MainActivity2: starting up observable...
12-17 21:36:09.256 20550-20550/rx.test D/MainActivity2: [onError]
12-17 21:36:09.256 20550-20550/rx.test W/System.err: android.os.NetworkOnMainThreadException
GovService.java
import java.util.List;
import retrofit.Call;
import retrofit.http.GET;
import rx.Observable;
public interface GovService {
@GET("/txt2lrn/sat/index_1.json")
Observable<MyTest> getOneTestRx();
}
MyTest.java
public class MyTest {
private String name, url;
private int num;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "Name: " + this.name + ", num: " + this.num + ", url: " + this.url;
}
}
MainActivity2.java
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import retrofit.GsonConverterFactory;
import retrofit.Retrofit;
import retrofit.RxJavaCallAdapterFactory;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class MainActivity2 extends AppCompatActivity {
private final String TAG = getClass().getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "[onCreate]");
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
RecyclerView mRV = (RecyclerView) findViewById(R.id.rv);
mRV.setLayoutManager(new LinearLayoutManager(this));// setup LayoutManager
mRV.setItemAnimator(new DefaultItemAnimator());// setup ItemAnimator
// setup retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://goanuj.freeshell.org")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
GovService service = retrofit.create(GovService.class);
Log.d(TAG, "starting up observable...");
Observable<MyTest> o = service.getOneTestRx();
o.subscribeOn(Schedulers.io());
o.observeOn(AndroidSchedulers.mainThread());
o.subscribe(new Subscriber<MyTest>() {
@Override
public void onCompleted() {
Log.d(TAG, "[onCompleted] ");
}
@Override
public void onError(Throwable t) {
Log.d(TAG, "[onError] ");
t.printStackTrace();
}
@Override
public void onNext(MyTest m) {
Log.d(TAG, "[onNext] " + m.toString());
}
});
}
}
答案 0 :(得分:33)
将代码的最后一部分重写为:
service.getOneTestRx()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<MyTest>() {
@Override
public void onCompleted() {
Log.d(TAG, "[onCompleted] ");
}
@Override
public void onError(Throwable t) {
Log.d(TAG, "[onError] ");
t.printStackTrace();
}
@Override
public void onNext(MyTest m) {
Log.d(TAG, "[onNext] " + m.toString());
}
});
来自@akarnokd的重要提示:
值得一提的是,需要将呼叫链接到此处,因为 Observable不是构建器模式(您修改设置的位置) 一个现有的对象)
答案 1 :(得分:8)
您应该致电Observable.unsubscribeOn(Schedulers.io())
,retrofit
将在http请求结束时取消订阅。
RxJavaCallAdapterFactory
的{{1}}
这样的行动。
retrofit-rxjava-adapter
但当if (!subscriber.isUnsubscribed()) {
subscriber.onCompleted();
}
为subscriber
时,它最终会调用SafeSubscriber
。
我的应用中存在此问题。
完整代码:
unsubscribe