2016-12-01 54 views
1

用Codename One編寫的我的應用程序涉及在主窗體中顯示相機預覽。我已經使用本地接口實現,使其在Android(iOS以後)上工作。以前的表單在Codename One上不會完全消失

該應用程序還包括在應用程序購買升級到完整版本。這就是爲什麼定期顯示錶單以建議用戶升級的原因。他們也可以選擇稍後升級,導致此升級到完整版本的形式消失,並使相機預覽的主窗體出現。

然而,在真實的設備上,有時升級到完整版本的形式並沒有完全消失,並且在主窗體上有回憶。在這種情況下,相機預覽會顯示在屏幕的一部分上,而應用程序按鈕不會顯示。然而,幾秒鐘後,如果用戶觸摸屏幕,主窗體將完全顯示,並且升級窗體的回憶消失。

看起來好像在UI線程上可能做了太多事情,但當用戶點擊按鈕關閉升級表單時,我只是打電話給new MainForm(theme).show()。所以這應該沒問題吧?請注意,CN1模擬器不顯示edt違例(但模擬器中沒有相機預覽)。

或者我必須在將組件添加到佈局後調用MainForm中的revalidate()嗎?我應該怎麼做才能讓這些回憶消失?

任何幫助非常感激,

回答

0

這些事情總是很難跟蹤,但我猜對部分以某種方式與新的形式碰撞。

確保你不叫postInvalidate除非你真的到,即使這樣,你通常應該限制和避免在可能的情況,因爲它可能會與我們的繪製邏輯衝突。

此外請確保您沒有更改父窗體的不透明度,例如如果你改變了表單UIID。

+0

謝謝@Shai對於這些建議。我既不會調用postInvalidate也不會更改父窗體的不透明度。 – HelloWorld

+0

我發佈了一個解決方案。你會@Shai介意看它並告訴它是否與問題有關? – HelloWorld

+1

這可能會導致不同的問題,invokeAndBlock打開一個完全獨立的線程,並可能導致問題。您已經看到與本地組件(在本機操作系統線程中呈現)相沖突的問題(在Codename One的EDT中)中添加了圍繞該問題工作的第三個線程,但這可能是運氣,可能會導致更糟糕的問題。 –

0

它看起來像找到了解決方案。事實上,我有一個初始化攝像頭和表面視圖的本地方法。我在EDT上運行此方法,然後顯示新的MainForm。

事實上,我接受invokeAndBlock()塊中的初始化方法。現在看起來,這種滯後效應遠沒有那麼明顯(我看不到它)。在我自己的邏輯中,我可以解釋它,因爲invokeAndBlock()將在單獨的線程上完成初始化工作,並且完全準備就緒(因此可以顯示攝像頭和表面視圖),可以顯示MainForm。

難道是實際的解決方案@Shai?