首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Volley本地请求仅在附加到USB调试时才起作用

Volley本地请求仅在附加到USB调试时才起作用
EN

Stack Overflow用户
提问于 2021-01-19 17:16:03
回答 2查看 51关注 0票数 0

我正在构建一个应用程序,作为测量设备和web应用程序之间的代理。这是必要的,因为测量设备不提供CORS / HTTPS实现,并且不能直接从web应用程序调用。

这是通过用我的手机创建一个热点并将测量设备连接到它来实现的。然后,我们运行一个托管RouterNanoHTTP服务器实例的后台服务。这个实例基本上只是将调用转发到测量设备。

我的应用程序在通过电脑连接到USB时运行得非常好。但是,在拔下USB电缆的那一秒,对测量设备的所有请求都会返回截击超时错误。我尝试了多种方法,包括设置binded network adapter manually。测量设备仍然可以从我的手机浏览器访问。因此,我认为这与其说是代码错误,不如说是某种配置错误。

我的AndroidManifest里有互联网和ACCESS_NETWORK_STATE。

编辑:看起来这可能与我的HttpServer实现有关。我已经在我的视图中添加了一个按钮来调用API,当断开USB连接时,它仍然有效。但是,任何通过HttpServer发出的请求都不再起作用。

相关代码:

代码语言:javascript
复制
override fun getUrl(url: String, callback: (result: String?) -> Unit) {
    val req = StringRequest(
        Request.Method.GET, url,
        Response.Listener<String> { res -> callback(res) },
        Response.ErrorListener { err ->
            Log.d("MD-ERROR", err.toString());
            callback(null)
        }
    )

    req.retryPolicy = DefaultRetryPolicy(
        5000,
        DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
    )

    this.requestQueue.add(req)
}

HTTP服务器:

代码语言:javascript
复制
class HttpServerWrapper(private val port: Int, private val xrfConnector: IXrfConnector) : AsyncHttpServer() {

/**
 * Starts the server
 */
fun startServer() {
    this.addMappings()
    this.listen(this.port)
}

fun addMappings() {
    this.get("/") { _, response: AsyncHttpServerResponse ->
        response.headers.add("Access-Control-Allow-Origin", "*")

        this.xrfConnector.getMeasurements {
            val gson = Gson()
            val json = gson.toJson(it?.measurements)

            response.send(json)
            response.end()
        }
    }
}

VolleyDebug的输出(第一个请求连接了USB,第二个请求没有连接):

代码语言:javascript
复制
2021-01-19 10:21:03.037 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (785  ms) [ ] http://192.168.43.9:8080/xapi/measurements?startDate=2021-01-12 0x676a9949 NORMAL 2
2021-01-19 10:21:03.038 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+0   ) [1621] add-to-queue
2021-01-19 10:21:03.040 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+1   ) [1613] cache-queue-take
2021-01-19 10:21:03.043 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+4   ) [1613] cache-hit-expired
2021-01-19 10:21:03.045 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+2   ) [1616] network-queue-take
2021-01-19 10:21:03.049 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+583 ) [1616] network-http-complete
2021-01-19 10:21:03.062 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+16  ) [1616] network-parse-complete
2021-01-19 10:21:03.065 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+4   ) [1616] network-cache-written
2021-01-19 10:21:03.068 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+0   ) [1616] post-response
2021-01-19 10:21:03.069 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+175 ) [ 2] done
2021-01-19 10:21:11.193 26316-26432/my.app.bridge I/System.out: http://192.168.43.9:8080/xapi/measurements?startDate=2021-01-12
2021-01-19 10:21:11.201 26316-26422/my.app.bridge D/Volley: [1613] WaitingRequestManager.maybeAddToWaitingRequests: new request, sending to network http://192.168.43.9:8080/xapi/measurements?startDate=2021-01-12
2021-01-19 10:21:26.390 26316-26316/my.app.bridge D/XRF-ERROR: com.android.volley.TimeoutError
2021-01-19 10:21:26.425 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (15229 ms) [ ] http://192.168.43.9:8080/xapi/measurements?startDate=2021-01-12 0x676a9949 NORMAL 3
2021-01-19 10:21:26.428 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+0   ) [1621] add-to-queue
2021-01-19 10:21:26.434 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+1   ) [1613] cache-queue-take
2021-01-19 10:21:26.439 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+5   ) [1613] cache-hit-expired
2021-01-19 10:21:26.441 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+4   ) [1615] network-queue-take
2021-01-19 10:21:26.443 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+5104) [1615] socket-retry [timeout=5000]
2021-01-19 10:21:26.448 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+10080) [1615] socket-timeout-giveup [timeout=10000]
2021-01-19 10:21:26.450 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+0   ) [1615] post-error
2021-01-19 10:21:26.455 26316-26316/my.app.bridge D/Volley: [2] MarkerLog.finish: (+35  ) [ 2] done
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-25 19:30:38

因此,问题似乎是为应用程序启用的电池优化。禁用此功能后,请求通过时没有任何问题。

唯一奇怪的是,你没有得到任何错误或记录你的请求被阻塞。我是在使用另一个HTTP库之后才发现这一点的:

代码语言:javascript
复制
2021-01-25 12:02:53.881 4942-1564/system_process D/ConnectivityService: Returning BLOCKED NetworkInfo to uid=xxx

接下来是一周的调试:D。

票数 0
EN

Stack Overflow用户

发布于 2021-01-19 19:59:29

问题出在您要向其发送请求的URL。

如果您的设备通过USB连接到系统,请尝试

代码语言:javascript
复制
http://10.0.2.2/myserverfile.php

否则,如果您的服务器是在线托管的,请使用http://www.myserverlocation.blah/myserverfile.php

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65788483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档