android–RxJava和Retrofit2:NetworkOnMainThreadException

android–RxJava和Retrofit2:NetworkOnMainThreadException,第1张

概述我意识到我在MainThread上使用了subscribeOn()/observeOn().我可以传递给subscribeOn()的选项有哪些?我可以传递给observeOn()的选项有哪些?12-1721:36:09.15420550-20550x.testD/MainActivity2:[onCreate]12-1721:36:09.23120550-20550x.testD/MainActivity2:start

我意识到我在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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1101925.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存