正在发送多个改造电话,但有些电话从未收到响应或错误

Posted

技术标签:

【中文标题】正在发送多个改造电话,但有些电话从未收到响应或错误【英文标题】:Multiple retrofit calls are being send but some never receive response or error 【发布时间】:2018-02-28 00:48:03 【问题描述】:

一般说明 当我在短时间内发送多个请求时,其中一些请求从未得到响应或错误。

API 我有一个单例类,其中保留了改造服务。我使用这个类来执行对 api 的所有调用,每个调用都返回带有某种数据的 Observable。

public class CoreApi 

    public static final String BASE_URL = "https://www.example.com/";

    private static CoreApi instance;

    private CoreApiService service;

    public static CoreApi get() 
        if (instance == null)
            instance = new CoreApi();
        retrun instance;
    

    private CoreApi() 

        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

        if (BuildConfig.DEBUG)
            httpClient.addInterceptor(httpLoggingInterceptor);

        httpClient.connectTimeout(60, TimeUnit.SECONDS);
        httpClient.readTimeout(60, TimeUnit.SECONDS);

        Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxErrorHandlingCallAdapterFactory.create())
            .client(httpClient.build());

        service = (builder.build()).create(CoreApiService.class);
    

    public Observable<SomeData> getSomedata(String authorization) 
            return service.getSomeData(authorization);
    


服务

interface CoreApiService 
    @GET("someDataEndpoint/")
    Observable<SomeData> getSomeData(@Header("Authorization") String authorizationToken);

致电 我在活动中设置了一个按钮,每次单击它时,它都会执行对 api 的调用:

Button button = (Button) findViewById(R.id.test_button);
button.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    CoreApi.get().getSomeData("JWT thisisexampletokenreplacedforthesakeofthisquestion")
                        .subscribeOn(Schedulers.io())
                        .observeOn(Schedulers.io())
                        .subscribe(new Action1<SomeData>() 
                            @Override
                            public void call(SomeData someData) 
                                 // operations are performed on data, irrelevant for the issue as even if I comment them the issue still occurs
                            
                    );
                
            );

问题 每当我点击按钮(不是太快)时,在日志中我可以看到请求是由改造发出的。 但是当我开始更快地单击按钮时,我可以在日志中看到正在发送请求,但并非所有请求都收到响应。没有错误,没有超时,什么都没有。在 logcat 中,我只能看到请求已经发出(见下文)。

09-19 11:26:05.421 18763-18821/com.myapp.app D/OkHttp: --> GET https://www.example.com/someDataEndpoint/ http/1.1
09-19 11:26:05.421 18763-18821/com.myapp.app D/OkHttp: Authorization: JWT thisisexampletokenreplacedforthesakeofthisquestion
09-19 11:26:05.422 18763-18821/com.myapp.app D/OkHttp: --> END GET

总结 上面的例子被简化了,但是这个问题只有在短时间内有很多调用时才会出现(不一定是同一个端点)。 起初,当我的 HandlerThread 负责以指定顺序从多个端点刷新用户数据时,我注意到它开始陷入随机点,有时在第 2 次,有时在第 10 次调用,有时在两者之间。奇怪的是,在其中一个调用卡住后,我仍然可以从应用程序中的其他地方执行其他调用。

【问题讨论】:

什么是 AhoyCoreApi()? @Anonymous,对不起,我改变了类的命名,让它看起来更具可读性,我忘记了构造函数。查看已编辑的问题 哦,我想知道你为什么没有收到任何错误 @Anonymous 在现实生活中,“授权令牌”是访问给定端点所需的授权令牌的实际值。这里只是一个例子,所以我用“授权令牌”替换它 但是我看到你的日志显示的是键而不是值 【参考方案1】:
 CoreApi.get().getSomeData(//Your value here instead of the key)
                    .subscribeOn(Schedulers.io())
                    .observeOn(Schedulers.io())
                    .subscribe(new Action1<SomeData>() 
                        @Override
                        public void call(SomeData someData) 
                             // operations are performed on data, irrelevant for the issue as even if I comment them the issue still occurs
                        
                );

您在授权标头中传递字符串而不是实际值。将您的授权令牌代码更改为值而不是密钥。

【讨论】:

这不是授权标头的问题,因为它工作正常。问题在于某些请求在日志中显示为已发送,但从未收到任何响应或错误

以上是关于正在发送多个改造电话,但有些电话从未收到响应或错误的主要内容,如果未能解决你的问题,请参考以下文章

一个通知推送窗口电话的多个回调

Firebase 电话身份验证未发送带有代码的短信

多对等连接:对等连接有时会失败:收到邀请响应,但我们从未向它发送邀请。中止

使用不同类型的响应改造错误处理

firebase admin:验证电话号码时“发生内部错误。原始服务器响应”

用户可以或不应该拥有多个电子邮件地址和电话号码? [关闭]