正在发送多个改造电话,但有些电话从未收到响应或错误
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
);
您在授权标头中传递字符串而不是实际值。将您的授权令牌代码更改为值而不是密钥。
【讨论】:
这不是授权标头的问题,因为它工作正常。问题在于某些请求在日志中显示为已发送,但从未收到任何响应或错误以上是关于正在发送多个改造电话,但有些电话从未收到响应或错误的主要内容,如果未能解决你的问题,请参考以下文章
多对等连接:对等连接有时会失败:收到邀请响应,但我们从未向它发送邀请。中止