代号一 - ConnectionRequest 调试

问题描述 投票:0回答:1

我在代号一中有以下代码:

        Log.p("getPageMap,pre addToQueueAndWait");
        NetworkManager.getInstance().addToQueueAndWait(connectionRequest);
        Log.p("getPageMap,post addToQueueAndWait");

它执行多次并从互联网检索数据(https://api.beta.tab.com.au...)。

当我在模拟器中运行时,一切正常。

当我在物理手机上运行并通过 logcat 进行监控时,两次执行工作正常,第三次执行导致第一个 Log.p 语句出现,但第二个 Log.p 语句不出现。即执行似乎在 addToQueueAndWait 中“冻结”。

是否可以进行进一步的日志记录/调试来确定问题的原因?

我尝试过的事情:我确实调用了 addNetworkErrorListener (但它似乎没有被触发)。我已经用基本的 Log.p 语句覆盖了 GZConnectionRequest 的 handleErrorResponseCode、handleException、postResponse 和 buildRequestBody,但它们似乎没有提供任何有用的信息。可能影响的事情:该网站最近已更改为返回 gzipped json,但我认为我已经相应地调整了此更改。 Cookie 可能是一个因素 - 它们在模拟器与设备中的处理方式是否不同?将 CZConnectionRequest 的优先级更改为 PRIORITY_CRITICAL 似乎产生了积极的影响。我应该放弃 GZConnectionRequest 并尝试其他方法吗?

codenameone
1个回答
0
投票

这听起来像是由于性能差异而只能在设备上看到的死锁或竞争条件。众所周知,这些东西很难调试,尤其是在设备上。

如果可能的话,我建议迁移代码以使用

addToQueue
。它更简单,因为它消除了处理线程阻塞的需要。该代码有点困难,因为它是异步的,我无法给您直接的等效代码。像这样的东西通常应该有效:

Log.p("getPageMap,pre addToQueue");
connectionRequest.addResponseListener(networkEvent -> {
    Log.p("getPageMap,post addToQueue");
});
NetworkManager.getInstance().addToQueue(connectionRequest);

或者,如果您想调试它,您可以执行以下操作:

  • 记录当前线程 - 这可以帮助了解正在发生的事情。您甚至可以在调试器中看到这一点。

  • 每次到达第一行时打印堆栈跟踪(以检查递归)。您可以通过抛出并捕获异常然后使用

    printStackTrace()
    来做到这一点。

  • 使用

    NetworkManager
    中的API检查影响。例如。使用
    updateThreadCount
    调高/调低值(默认为 2)以查看结果是否会改变。使用
    enumurateQueue()
    列出队列的内容。

© www.soinside.com 2019 - 2024. All rights reserved.