在运行时,我使用回调模式来运行通用代码,并在完成后使用回调来在GUI上执行代码。所以在我的处理程序中,我使用runOnUiThread函数来对回调。
这些都是异步http调用。在运行时,如果我打断并使用后退按钮并转到另一个片段,系统将交换片段并运行两个回调(正确回调的新片段,以及应该在旧的回调上运行的旧回调)片段在新的当前片段上)。这是错误的,新片段获得两个回调,但是当它被初始化时,它被分配给另一个片段......
这没有任何意义,您只能通过在异步调用完成之前在运行时切换片段来观察行为。我不知道它是怎么可能的,在代码中我检查回调是否为null因此它应该被垃圾收集以及它如何在新的回调上运行我不知道它是如何可能的....没有其他任务发生改变这一点。它几乎就像在内存中寻找函数签名并运行它,即使它在错误的对象上运行它。
有没有人知道发生了什么?我用一个丑陋的代码表达了它,我只是不知道这是怎么回事?
我理解明显的候选人是我在某个地方再次分配它,但答案是否定的。创建片段时,它会创建一个对象,将自己指定为回调,并且处理开始,因此当片段被销毁时,它也应该是。但异步任务仍在执行,这很好,为什么它在主gui上的新线程上进行回调我猜是因为runOnUiThread,所以该函数以某种方式改变了回调对象在内存中指向的内容?
答案 0 :(得分:0)
它的代码: - )
在Android中“幕后”没有任何魔法发生,也没有任何引用被更改。
许多人遇到像你这样的问题,而且总是因为他们认为在替换或删除片段或活动实例时,Android系统会以某种方式进行清理。它不是,因此仍然会对过时的片段或活动执行回调。
runOnUiThread接受Runnable并在UI线程有空闲时间(在调用生命周期方法和完成渲染之后)运行它。它不是魔术: - )