我意识到我在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 one rror(Throwable t) { Log.d(TAG, "[onError] "); t.printstacktrace(); } @OverrIDe public voID onNext(MyTest m) { Log.d(TAG, "[onNext] " + m.toString()); } }); }}
解决方法:
将代码的最后一部分重写为:
service.getoneTestRx() .subscribeOn(Schedulers.io()) .observeOn(AndroIDSchedulers.mainThread()) .subscribe(new Subscriber<MyTest>() { @OverrIDe public voID onCompleted() { Log.d(TAG, "[onCompleted] "); } @OverrIDe public voID one rror(Throwable t) { Log.d(TAG, "[onError] "); t.printstacktrace(); } @OverrIDe public voID onNext(MyTest m) { Log.d(TAG, "[onNext] " + m.toString()); } });
来自@akarnokd的重要提示:
总结Worth mentioning that one needs to chain the calls as here because
Observable is not the builder pattern (where you modify the settings
of an existing object)
以上是内存溢出为你收集整理的android – RxJava和Retrofit2:NetworkOnMainThreadException全部内容,希望文章能够帮你解决android – RxJava和Retrofit2:NetworkOnMainThreadException所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)