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

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

我有一个应用程序,它反复从 API 获取一些数据。当我有 wifi 连接时,这真的很好。但是使用移动数据,我的请求要么超时,要么花费 20 秒。这没有意义,因为如果我只是在 android 浏览器中输入 API url,它几乎立即加载。另外,API 是一个非 s 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 通过蜂窝,因为它是由管理,所以替代方法是定义和使用一个 with its own DNS。如果这似乎相当在顶部或不方便,你也可以尝试做一个direct DNS query在后续的应用程序中使用

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

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

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

相关推荐

  • android wifi传输数据提升移动体验的新方式

    Android Wifi传输数据是指使用Android手机通过Wifi网络来传输数据。实现方法有两种:使用Socket编程:…

    2023-01-08 11:59:43
    0 54 38
  • adb wifi调试:如何使用ADB Wi-Fi调试Android设备

    adb wifi调试是一种无线调试方式,它可以让开发者在不使用USB连接的情况下,通过WiFi连接来进行Android设备的调试。…

    2023-01-22 04:26:26
    0 47 41
  • 手机之间传输文件:通过WiFi在Android手机之间流式传输语音

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

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

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

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

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

    2022-11-30 07:08:04
    0 62 15
  • android 个推:让你的Android应用变得更加强大

    Android 个推是一个跨平台的推送服务,允许开发者在 Android 平台上发送消息给用户。它是一个基于云端的消息推送服务,可以为应用提供实时、可靠的消息推送服务。…

    2023-06-14 12:54:10
    0 36 95
  • android 开发面试题如何有效利用Android框架实现优化的用户体验?

    示例示例什么是Android?Android 是一种基于Linux的开源操作系统,主要用于移动设备,如智能手机和平板电脑。它提供了一个全面的框架,可以让开发者创建出各种各样的应用程序,从而满足用户的需求。…

    2023-05-30 15:23:42
    0 15 50
  • android启动界面:Android应用程序开发之旅

    实例实例Android启动界面是指当用户打开应用时,第一个显示的界面。它可以帮助应用程序在启动时让用户感受到良好的体验。下面是一个Android启动界面的代码实例:…

    2023-09-01 01:25:00
    0 30 86

发表评论

登录 后才能评论

评论列表(41条)