簡體   English   中英

runOnUiThread和回調奇怪的行為

[英]runOnUiThread and callbacks strange behavior

在運行時,我使用回調模式來運行通用代碼,並在完成后使用回調來在GUI上執行代碼。 所以在我的處理程序中,我使用runOnUiThread函數來對回調。

這些都是異步http調用。 在運行時,如果我打斷並使用后退按鈕並轉到另一個片段,系統將交換片段並運行兩個回調(正確回調的新片段,以及應該在舊的回調上運行的舊回調)片段在新的當前片段上)。 這是錯誤的,新片段獲得兩個回調,但是當它被初始化時,它被分配給另一個片段......

這沒有任何意義,您只能通過在異步調用完成之前在運行時切換片段來觀察行為。 我不知道它是怎么可能的,在代碼中我檢查回調是否為null因此它應該被垃圾收集以及它如何在新的回調上運行我不知道它是如何可能的....沒有其他任務發生改變這一點。 它幾乎就像在內存中查找函數簽名並運行它,即使它在錯誤的對象上運行它。

有沒有人知道發生了什么? 我用一個丑陋的代碼表達了它,我只是不知道這是怎么回事?

我理解明顯的候選人是我在某個地方再次分配它,但答案是否定的。 創建片段時,它會創建一個對象,將自己指定為回調,並且處理開始,因此當片段被銷毀時,它也應該是。 但異步任務仍在執行,這很好,為什么它在主gui上的新線程上進行回調我猜是因為runOnUiThread,所以該函數以某種方式改變了回調對象在內存中指向的內容?

它是你的代碼:-)

在Android中“幕后”沒有任何魔法發生,也沒有更改引用。

許多人遇到像你這樣的問題,而且總是因為他們認為在替換或刪除片段或活動實例時,Android系統會以某種方式進行清理。 它不是,因此在一個過時的片段或活動上仍然執行回調。

runOnUiThread接受Runnable並在UI線程有空閑時間(在調用生命周期方法和完成渲染之后)運行它。 它不是魔術:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM