rengwuxian / RxJavaSamples

RxJava 2 和 Retrofit 结合使用的几个最常见使用方式举例
3.94k stars 858 forks source link

关于Subscriber.onStart()何时被调用的问题 #11

Open lisuperhong opened 8 years ago

lisuperhong commented 8 years ago

大大你好,你写的文章上说Subscriber.onStart()总是在 subscribe所发生的线程被调用,但下面的代码并没有报错: String baseUrl = "https://api.douban.com/v2/movie/"; Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build();

    ClientApi clientApi = retrofit.create(ClientApi.class);
    clientApi.getTopMovies(0, 5)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<MovieEntity>() {

                @Override
                public void onStart() {
                    progressBar.setVisibility(View.VISIBLE);
                }

                @Override
                public void onCompleted() {
                    progressBar.setVisibility(View.GONE);
                    Toast.makeText(context, "完成网络请求!", Toast.LENGTH_LONG).show();
                }

                @Override
                public void onError(Throwable e) {
                    text.setText(e.getMessage());
                }

                @Override
                public void onNext(MovieEntity movieEntity) {
                    text.setText(movieEntity.toString());
                }
            });

我使用subscribeOn设置subscribe()在IO线程,直接在onStart()方法中显示progressBar,按理说progressBar没有在主线程执行,应用会奔溃才对,但是一切正常

ShanZha commented 8 years ago

onStart()应该是跟随你当前线程的,如果你当前在主线程的话,肯定不会异常

loulousky commented 8 years ago

progress是貌似是可以在线程中使用的唯一的一个VIEW

loulousky commented 8 years ago

RXJAVA 可以指定ONSTART的使用线程

mattxzhang commented 8 years ago

确实有这个问题,是什么原因,指定是子线程,但onStart也可以显示dialog或者其他的loading