【问题标题】:runOnUiThread and callbacks strange behaviorrunOnUiThread 和回调奇怪的行为
【发布时间】:2015-03-07 06:06:31
【问题描述】:

在运行时,我使用回调模式来运行通用代码,并在完成后使用回调在 GUI 上执行代码。所以在我的处理程序中,我使用 runOnUiThread 函数来处理回调。

这些都是异步 http 调用。在运行时,如果我中断并使用后退按钮并转到另一个片段,例如,系统将换出片段并运行两个回调(新片段一个在正确的回调上,旧的回调应该在旧的新的当前片段上的片段)。这是错误的,新片段获得了两个回调,但是当它被初始化时,它被分配给了另一个片段......

这没有任何意义,您只能通过在异步调用完成之前在运行时切换片段来观察行为。我看不出这怎么可能,在代码中我检查回调是否为空,所以它应该被垃圾收集以及它如何在新的回调上运行我不知道它是怎么可能的......没有额外的分配发生改变这一点。这几乎就像它只是在内存中查找函数签名并运行它,即使它运行在错误的对象上。

有人知道发生了什么吗?我用一个丑陋的代码来压制它,我只是不知道这怎么可能?

我知道如果我在某个地方再次分配它,那么明显的候选人是,但答案是否定的。创建片段时,它会创建一个对象,将自己分配为回调,然后开始处理,因此当片段被销毁时,它也应该被销毁。但是异步任务仍在执行,这很好,为什么它在主gui上的新线程上进行回调我猜是因为runOnUiThread,所以该函数以某种方式改变了回调对象在内存中指向的内容?

【问题讨论】:

  • 如果没有发布任何代码,任何人都很难为您提供帮助。

标签: java android callback


【解决方案1】:

这是你的代码:-)

在 Android 的“幕后”并没有发生任何魔法,也没有更改任何引用。

很多人都遇到像你这样的问题,这总是因为他们认为 Android 系统在替换或删除片段或活动实例时会以某种方式进行清理。它不是,因此仍然在过时的片段或活动上执行回调。

runOnUiThread 获取一个 Runnable 并在 UI 线程有空闲时间时运行它(在调用生命周期方法并完成渲染之后)。它也不是魔法:-)

【讨论】:

  • 我唯一的代码是 new AsyncCall().setCallback(this).execute()。并且在异步调用类中执行时,它分配了“this”,它是实现回调接口的片段,该接口有一个 onComplete 方法。在片段生命周期中,它只在开始时创建一次,而不是两次,再也不会。当片段从导航抽屉容器示例中换出时,它不会在已消失的片段上调用回调......它会在新换入的片段上调用它。我明白你在说什么,但我只是不明白我在哪里犯了错误......
  • 我得看看你从哪里得到了 AsyncCall 类以及更多的代码才能猜出你的问题是什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
相关资源
最近更新 更多