我正在使用OkHttp和Retrofit来制作我的应用程序的网络请求.我还使用拦截器进行身份验证,并在必要时重试请求.
服务器有时会出现临时问题,并返回空体,尽管响应状态为200 OK.这会导致我的应用程序崩溃,因为调用了Retrofit Callback的成功块,返回(并使用GSON解析)的自定义对象为null,成功回调中的代码假定返回一个对象.
我已经向服务器团队报告了这个问题,但我也想修复它,而不必使用null检查将所有成功回调代码包装在应用程序上.
Currenty我倾向于两个选项,虽然任何其他想法都是最受欢迎的:1)不从拦截器返回(这甚至可能吗?)并且只显示一个错误对话框2)返回一些会使Retrofit调用失败的部分打回来.
我的代码如下.正如您所看到的,当收到空体时,我会重试该请求最多3次.
@Override
public Response intercept(Chain chain) throws IOException
{
// First
Request request = chain.request();
Response response = chain.proceed(request);
....
....
....
// Retry empty body response requests for a maximum of 3 times
Integer retryMaxCount = 3;
MediaType contentType = response.body().contentType();
String bodyString = response.body().string();
while (bodyString.length() == 0 && retryMaxCount > 0)
{
//Empty body received!, Retrying...
retryMaxCount--;
response = chain.proceed(request);
bodyString = response.body().string();
}
if (bodyString.length() != 0)
{
// Create …Run Code Online (Sandbox Code Playgroud) 我通过复制现有文件夹在XCode中启动了一个新项目,因为我的新应用程序将与旧版本具有许多共同功能.
问题是新应用程序不会使用我在旧应用程序中使用的框架.当我删除框架时,包括该框架在内的所有文件都会引发错误.
基本上我想在许多文件上禁用所有语法检查,依赖性检查等.我希望XCode忽略这些文件,尽管它们在项目树中.稍后当我修改它们时,我将再次手动启用它们.通过这种方式,我可以编译和测试我的小错误更改,而不会修复它在"未修改"文件中导致的所有错误,无论如何我将在未来修复.
我可以从项目树中删除它们,然后在我的工作完成后逐个添加它们,但我不想这样做,因为我的项目树可能搞砸了,应该有另一种方法来实现这一点.
我尝试从所有目标成员身份中删除这些文件,但它没有帮助.
提前致谢.
我正在寻找一种方法来检测我的应用程序正在运行的设备.我对软件版本不感兴趣.我搜索了很多问题但是没有一个(令人惊讶地)满足了我的需求,原因如下:
解决方案1:
NSString *deviceType = [UIDevice currentDevice].model;
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它只给我"iPad".我想知道它是iPad,iPad 2,新iPad,iPhone 3GS,iPhone4等.
解决方案2:不测试设备类型,检查各个功能
这不适用,因为我希望此数据收集用户统计信息,而不是执行任何特定于设备的操作.
解决方案3:使用此处的 UIDeviceHardware
此代码看起来很过时,似乎访问设备上的私有数据.甚至有人争论使用此应用的应用是否会获得批准.更重要的是,我不知道它是如何工作的:) 这里也有另一种选择
我提到的最后两个中的任何一个都可以安全使用吗?他们未来是否合规?他们是否遵守Apple批准规则?
或者还有其他方法来解决这个问题吗?
提前致谢.
我在我的应用中使用了Google AdMob SDK(最近刚下载的最新版本).
当我的应用启动时,它会冻结4-5秒,直到加载并显示广告.之后它运行顺利.当我注释掉横幅请求行时,应用程序正常启动.
我已经制作了一个自定义助手类,其中我有以下代码.
- (void) getGoogleBanner:(UIViewController *) targetController
{
self.googleBannerView.rootViewController = targetController;
[self.googleBannerView.rootViewController.view addSubview:self.googleBannerView];
[self.googleBannerView setDelegate:self];
GADRequest* request = [GADRequest request];
[self.googleBannerView loadRequest:request];
}
Run Code Online (Sandbox Code Playgroud)
哪里
我想知道是否有人遇到过这个问题,以及它是如何解决的.我愿意接受任何可以消除冻结问题的想法.我试图将代码运行到后台线程,但我失败了因为我对它不是很有经验.
非常感谢任何帮助,提前谢谢.