TonnyL/Espresso

请教个问题

PiPiCaptain opened this issue · 12 comments

'compositeDisposable.clear();'
这句代码只是取消RxJava订阅,还是说能真正地取消网络请求?

'compositeDisposable.clear();'
Does this line clear the RxJava subscriptions or cancel the network request truly?

@PiPiCaptain 你好
应该是取消订阅。

Hi,
The answer should be cancelling all the subscriptions.

@TonnyL 如果想真正地取消网络请求,应该怎么做?有没有研究?

@PiPiCaptain
如果是使用的Retrofit官方Adapter。 那么dispose会自动取消网络请求。如果是自己封装的网络请求。使用

Observable.create(e -> e.setCancellable(() ->  request.cancel()));

来自动取消请求。

@wbinarytree 我现在的项目,还是在用RxJava1.x版本。因为项目里有一个第三方类库在用RxJava1.x,所以我还暂时不能转用RxJava2.x版本。我现在是用Subscription.unsubscribe();这个方法来取消,但经过网络抓包测试,只是取消了订阅,并不能取消网络请求。

@wbinarytree 但是我看Retrofit Issues,JakeWharton大神说这个方法是可以的,但我测试了第多次,就是无法取消网络请求。
square/retrofit#1087

@PiPiCaptain 无法取消网络请求不一定是你的Subscription出了问题。 在订阅之前有没有用publish/share/replay等等操作符?

@wbinarytree 都没用到

@PiPiCaptain 代码贴出来看一下吧。

第一步:
@get("adat/sk/{cityId}.html")
Observable loadDataByRetrofitRxjava(@path("cityId") String cityId);

第二步:
addSubscription(apiStores.loadDataByRetrofitRxjava(cityId),
new ApiCallback() {
@OverRide
public void onSuccess(MainModel model) {
mvpView.getDataSuccess(model);
}

                @Override
                public void onFailure(String msg) {
                    mvpView.getDataFail(msg);
                }


                @Override
                public void onFinish() {
                    mvpView.hideLoading();
                }

            });

public abstract class BasePresenter implements Presenter {
public V mvpView;
private CompositeSubscription mCompositeSubscription;

@Override
public void attachView(V mvpView) {
    this.mvpView = mvpView;
    initApiStores();
}

@Override
public void detachView() {
    this.mvpView = null;
    unsubscribe();
}

//RXjava取消注册,以避免内存泄露
private void unsubscribe() {
    if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) {
        mCompositeSubscription.unsubscribe();
    }
}

public void addSubscription(Observable observable, Subscriber subscriber) {
    if (mCompositeSubscription == null) {
        mCompositeSubscription = new CompositeSubscription();
    }
    mCompositeSubscription.add(observable
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread(),true)
            .unsubscribeOn(Schedulers.io())
            .subscribe(subscriber));
}

protected abstract void initApiStores();

}

public abstract class ApiCallback extends Subscriber {

public abstract void onSuccess(M model);

public abstract void onFailure(String msg);

public abstract void onFinish();


@Override
public void onError(Throwable e) {
    e.printStackTrace();
    if (e instanceof HttpException) {
        HttpException httpException = (HttpException) e;
        //httpException.response().errorBody().string()
        int code = httpException.code();
        String msg = httpException.getMessage();
        LogUtil.d("code=" + code);
        if (code == 504) {
            msg = "网络不给力";
        }
        if (code == 502 || code == 404) {
            msg = "服务器异常,请稍后再试";
        }
        onFailure(msg);
    } else {
        onFailure(e.getMessage());
    }
    onFinish();
}

@Override
public void onNext(M model) {
    onSuccess(model);

}

@Override
public void onCompleted() {
    onFinish();
}

}

public class AppClient {
public static Retrofit mRetrofit;

public static Retrofit retrofit() {
    if (mRetrofit == null) {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        OkHttpClient okHttpClient = builder.build();
        mRetrofit = new Retrofit.Builder()
                .baseUrl(ApiStores.API_SERVER_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(okHttpClient)
                .build();
    }
    return mRetrofit;
}

}

@wbinarytree 上面的代码

@PiPiCaptain 。看起来没什么大问题 CompositeSubscription用clear()代替unsubscribe()试一下?

Then I will close this issue, if you have any other problem about it, do not hesitate to reopen it or just open another one. Happy coding😀!