Android应用程序与移动数据的工作方式与 wifi不同

我有一个应用程序,它反复从 API 获取一些数据。当我有 wifi 连接时,这真的很好。但是使用移动数据,我的请求要么超时,要么花费 20 秒。这没有意义,因为如果我只是在 android 浏览器中输入 API url,它几乎立即加载。另外,API 是一个非 https api 我不知道这是否重要。任何想法可能导致这一点?我的 Ktor 客户端:

我有一个应用程序,它反复从 API 获取一些数据。当我有 wifi 连接时,这真的很好。但是使用移动数据,我的请求要么超时,要么花费 20 秒。这没有意义,因为如果我只是在 android 浏览器中输入 API url,它几乎立即加载。另外,API 是一个非 https api 我不知道这是否重要。任何想法可能导致这一点?我的 Ktor 客户端:

object Ktor {
val ktor = Http(Android) {
    install(DefaultRequest) {
        header("apiKey", "apiKey")
    }
    install(ContentNegotiation) {
        json()
    }
    defaultRequest {
        contentType(ContentType.Application.Json)
        accept(ContentType.Application.Json)
    }
}
}

我的产品存储库:

object ProductRepository {
const val URL = "API"
const val LATEST_APK_URI = "$URL/apk"
suspend fun getProducts() = ktor.get("$URL/products").body<Map<String, List<ProductItem>>>().map {
    it.key to it.value.sortedBy { item -> item.done }
}.toMap() 
}

我的视图模型:

class ProductViewModel : ViewModel() {
val productFlow = mutableStateMapOf<String, List<ProductItem>>()
val errorFlow = MutableStateFlow<Error?>(null)
val lastRefreshFlow = MutableStateFlow<DateTimeTz?>(null)
fun refreshProducts(context: Context) {
    viewModelScope.launch {
        kotlin.runCatching {
            ProductRepository.getProducts()
        }.onSuccess {
            productFlow.clear()
            productFlow.putAll(it)
            lastRefreshFlow.value = DateTime.nowLocal()
            //updateOrder(context)
            context.cacheFile.updateCache(productFlow)
        }.onFailure {
            errorFlow.value = SilentError("Konnte Produkte nicht neu laden", it)
        }
    }
}
}
1

浏览器将额外的标头添加到请求中,这些标头由 DDOS 保护机制使用,这些机制通常会根据客户端的 IP 等各种条件延迟或简单地拒绝请求。有时,如果不在标头中指定主机名,您甚至无法向服务器 IP 发出请求 (大概是因为 IP 是执行 DDOS 过滤的代理服务器,而不是终端服务器)。可能是代理不信任移动的 IP / 您的宽带应用程序使用的 IP。

服务器 / 云比 webapp 的实际代码更可能导致延迟。尝试使用不同的移动来查看它们是否都导致延迟。还要检查实际的 IP 及其关联的国家 / 地区。使用traceroute查看请求中的延迟可能有助于您查明问题。

如果您使用的域不是原始 IP,您可能还需要检查 DNS 解析是否导致延迟,尽管它不太可能导致重大和重复的延迟,因为它会缓存查询。

最后但并非最不重要的检查您使用客户端的 HTTP 库,它可能会做一些奇怪的“优化”和请求排队,这可能会搞砸,特别是如果你改变连接,而应用程序运行(凌空已知会导致相当悲伤和缓存响应在其默认设置)。

这是奇怪的 DNS 不缓存域 / IP 对第一次查询后,以便后续查询更快,可能是关于域指示它不要。据我所知,你不能做很多关于 DNS 通过蜂窝,因为它是由管理,所以替代方法是定义和使用一个VPN with its own DNS。如果这似乎相当在顶部或不方便,你也可以尝试做一个direct DNS query在后续的应用程序中使用

您还可以查看finding current DNS in Androidsending a UDP DNS query

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(72)
Android股票图表
上一篇
嗅探Android应用程序以查找APIURL
下一篇

相关推荐

  • 手机之间传输文件:通过WiFi在Android手机之间流式传输语音

    关于手机之间传输文件的问题,在livestream the voice中经常遇到,我试图从麦克风流音频从 1 Android 到另一个通过 WiFi。看了一些例子后,我做了 2 个应用程序与每个单一的活动,1 捕获和发送音频和其他接收。…

    2022-12-27 13:53:12
    0 24 63
  • 笔记本电脑发射wifi:使用WiFi显示的笔记本电脑上的Android屏幕

    关于笔记本电脑发射wifi的问题,在wife display中经常遇到,我想使用“wifi-display”在我的笔记本电脑上显示 Android 设备屏幕。根据 documentation protocol 是熟悉的 rtsp。我做了很多调试,几乎完成。我不想使用 wifi-direct.…

    2022-12-19 05:22:35
    0 56 81
  • 管理wifi:Android-管理多个Wifi连接

    关于管理wifi的问题,在2 different wifi networks中经常遇到,我在一个 Android 应用程序的设计阶段,将需要连接到多个 WiFi 网络,我想知道是否有人可以提供建议和 / 或代码段关于最好的方式去这一点。…

    2022-11-30 07:08:04
    0 15 20
  • android 懒加载:实现 Android 懒加载的优化技术

    Android 懒加载指的是在需要的时候才加载某些资源,而不是一开始就加载所有资源。这样可以减少应用程序启动时的内存占用,提高用户体验。…

    2022-12-31 01:57:14
    0 70 70
  • android studio使用本地gradle实现快速、高效开发

    Android Studio使用本地Gradle的步骤如下:在Android Studio中打开你的项目,然后点击“File”菜单,选择“”;…

    2023-01-18 06:05:26
    0 81 43
  • android 恢复出厂设置:如何在 Android 手机上恢复出厂设置

    Android 恢复出厂设置是指将 Android 手机恢复到出厂时的默认状态,即清除手机上的所有数据和设置,并重新安装系统。恢复出厂设置的代码如下:…

    2023-01-17 09:47:03
    0 59 92
  • android登录页面:登录你的Android账号

    Android登录页面是指用户在使用Android应用程序时,需要输入用户名和密码进行登录才能使用该应用程序的界面。Android登录页面的布局通常会包括一个文本框,用于输入用户名;一个文本框,用于输入密码;一个按钮,用于提交登录信息;一个按钮,用于注册新用户;以及一个按钮,用于忘记密码。…

    2023-01-06 07:50:54
    0 95 14
  • android播放视频简单易用的视频播放方式。

    Android播放视频的步骤如下:创建一个对象,用来显示视频。…

    2023-01-25 15:27:06
    0 41 79

发表评论

登录 后才能评论

评论列表(35条)