看板 java 關於我們 聯絡資訊
想請問一下版上高手 本人目前在寫一個安卓APP的功能頁 功能是可以上傳圖片到網路圖床後取回網址 並把網址寫入雲端的資料庫 送REQUEST的套件用的是OKHTTP 但是這套件用的好像是多執行緒 所以出現一個狀況是 我圖片還沒上傳完取到網址 在上傳方法下面 寫入資料庫的方法就先跑了..... 結果就是網址都還沒拿到 資料就已經寫完了 所以想請問一下有什麼辦法限制一定要上傳完取回網址後 程式才繼續往下跑 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.254.208.101 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1486131357.A.CAC.html
ssccg: 那你就等取完網址再呼叫上傳雲端啊? 自己連呼叫兩次是? 02/03 22:23
grezod: 修正一下 套件是AsyncHttpClient 02/03 22:24
grezod: 問題點就是上傳的方法明明在傳圖下面 02/03 22:24
ssccg: android如果在main thread呼叫一定是用非同步API,完成後才 02/03 22:28
ssccg: 繼續是要寫在callback裡,不是下一行 02/03 22:29
grezod: 謝謝s大 callback是個好方法 02/03 22:35
grezod: 不過因為我的程式是用for回圈設變數動態對應不同的圖片數 02/03 22:36
grezod: 量 02/03 22:36
grezod: 不是一個接一個 所以是否有辦法判斷多個上傳的執行緒都跑 02/03 22:38
grezod: 完後 才跑寫資料庫的方法 02/03 22:38
ssccg: 當然可以但是怎麼寫比較簡單要看你用的library和版本 02/03 22:53
grezod: 請問S大有什麼關鍵字或網頁可參考的嗎 02/03 23:04
ssccg: 如果library沒,最通用的大概是ExecutorService的invokeAll 02/03 23:05
grezod: 我估狗看看 感謝 02/03 23:09
ssccg: 最簡單的作法是CompletableFuture但是要7.0+或用別的lib 02/03 23:12
grezod: 好的 謝謝分享! 02/03 23:17
AminLA: 這用countdownlatch 可以實現,但要記得處理好time out與 02/04 17:15
AminLA: 異常 02/04 17:15
grezod: 回報一下結果 我用S大說的invokeall 好像跟asyncHttpClie 02/04 22:01
grezod: 會相衝 只要一跑到送POST那行就會停擺 02/04 22:02
grezod: 後來改用AMI大說的COUNTDOWNLATCH 有成功達到我要的效果 02/04 22:03
grezod: 不過奇怪的是我要顯示讀取中的DIALOG他一定要等TASK跑完才 02/04 22:03
grezod: 會出現 02/04 22:03
ssccg: 你現在的作法大概是block了main thread... 02/05 00:34
ssccg: 要用Executor或Future系列的東西,就不用async client 02/05 00:34
ssccg: 直接在Executor的thread上用同步方式執行就好 02/05 00:35
ssccg: 然後負責等所有工作完成的(invokeAll/latch的await)也必須 02/05 00:36
ssccg: 另起一個thread來做,才不會block main thread 02/05 00:36
ssccg: main thread的觀念是android(其他GUI framework大概也是) 02/05 00:38
ssccg: 必須要弄清楚的 02/05 00:39
grezod: 感謝分享! 02/05 08:17