![](/img/trans.png)
[英]What is the difference between finish() and supportFinishAfterTransition()?
[英]What is the difference between new Handler(Looper.getMainLooper()).postDelayed(() -> finish(), 500); and finish()?
我應該打電話給finish();
或new Handler(Looper.getMainLooper()).postDelayed(() -> finish(), 500);
在向 SQLite 數據庫添加注釋后? 我想調用這兩個代碼之一來完成活動並返回 MainActivity。 使用它們中的任何一個都會得到相同的結果,並且注釋將被添加到 RecyclerView。
第二個問題:如果沒有 lambda 表達式,這會是什么樣子,並且變得更簡單。 new Handler(Looper.getMainLooper()).postDelayed(() -> finish(), 500);
如postDelayed
的文檔(強調我的):
使 Runnable r 添加到消息隊列中,並在指定的 time 過去后運行。
因此, postDelayed
版本將在您撥打電話后(至少)運行 500 毫秒,而不是finish
將立即完成活動。
延遲有充分的理由嗎? 也許。 如果您的一個活動等待另一個finish
,那么立即返回可能會導致有時在 SQLite 更新完成寫入之前返回。 如果是這種情況,那么您的主視圖可能看起來好像還沒有真正更新,至少在您下次填充它之前是這樣。
MAIN THREAD -------- SQL write requested -- finish() -- query for new items -- idle
OTHER THREAD ------------------------------------------------- list updated --- idle
但是,500ms 並沒有什么特別之處; 在大多數情況下,這可能是矯枉過正,在極少數情況下可能還不夠。 理想情況下,您應該確定何時寫入更新並在此之后完成 Activity。 這將如何工作取決於您寫入數據庫的位置和方式,您尚未向我們展示。
對於它的價值,延遲代碼的非 lambda 版本如下所示:
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override public void run() {
finish();
}
}, 500);
...但我發現這比 lambda 版本更難閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.