簡體   English   中英

new Handler(Looper.getMainLooper()).postDelayed(() -> finish(), 500); 有什么區別? 和完成()?

[英]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.

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