【问题标题】:OkHttp async interceptor or authenticatorOkHttp 异步拦截器或身份验证器
【发布时间】:2015-11-19 17:04:16
【问题描述】:

有什么方法可以拦截或认证异步请求吗?例如在这样的流程中:从用户那里获取密码,使用它来获取令牌,然后重试被拦截的调用?

【问题讨论】:

    标签: okhttp


    【解决方案1】:

    我也有同样的问题here

    我在代码的getToken方法中使用wait()notify(),但是因为我在Retrofit库中使用了OkHttp,所以它正在创建一个新线程并且可以在这里进行异步操作。

        public synchronized void getToken() throws InterruptedException {
        if (!isRefreshing()) {
            //This is very important to call notify() on the same object that we call wait();
            final TokenProvider myInstance = this;
            setRefreshing(true);
            Log.d("refreshToken", "Refreshing token..." );
    
           //Make async call
           getRestClient().getAccountService().getRefreshedToken(mLoginData.getRefreshToken())
                    .subscribe(new Observer<LoginResponse>() {
                        @Override
                        public void onCompleted() {
                            synchronized (myInstance) {
                                setRefreshing(false);
                                Log.d("refreshToken", "notifyAll onComplete.");
                                myInstance.notifyAll();
                            }
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            synchronized (myInstance) {
                                setRefreshing(false);
                                myInstance.notifyAll();
                                Log.d("refreshToken", "onError .");
                            }
                        }
    
                        @Override
                        public void onNext(LoginResponse loginResponse) {
                            synchronized (myInstance) {
                                mLoginData = loginResponse;
                                Log.d("refreshToken", "notifyAll onNext .");
                                myInstance.notifyAll();
                            }
                        }
                    });
        }
    
            Log.d("refreshToken", "before wait ." + android.os.Process.getThreadPriority(android.os.Process.myTid()) + this.toString());
            this.wait();
            Log.d("refreshToken", "after wait ." + android.os.Process.getThreadPriority(android.os.Process.myTid()) + this.toString());
    }
    

    如果这对你有用,你可以试试。

    【讨论】:

    • 是的,我有完全相同的想法,但我不确定这是否是最干净的方法。
    • 如果您找到更好的解决方案,请告诉我。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2017-11-16
    • 2016-08-07
    • 2017-06-15
    相关资源
    最近更新 更多