[問題如何限制某個方法跑完才執行下個方法

看板java作者 (grezod)時間8年前 (2017/02/03 22:15), 編輯推噓0(0031)
留言31則, 3人參與, 最新討論串1/1
想請問一下版上高手 本人目前在寫一個安卓APP的功能頁 功能是可以上傳圖片到網路圖床後取回網址 並把網址寫入雲端的資料庫 送REQUEST的套件用的是OKHTTP 但是這套件用的好像是多執行緒 所以出現一個狀況是 我圖片還沒上傳完取到網址 在上傳方法下面 寫入資料庫的方法就先跑了..... 結果就是網址都還沒拿到 資料就已經寫完了 所以想請問一下有什麼辦法限制一定要上傳完取回網址後 程式才繼續往下跑 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.254.208.101 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1486131357.A.CAC.html

02/03 22:23, , 1F
那你就等取完網址再呼叫上傳雲端啊? 自己連呼叫兩次是?
02/03 22:23, 1F

02/03 22:24, , 2F
修正一下 套件是AsyncHttpClient
02/03 22:24, 2F

02/03 22:24, , 3F
問題點就是上傳的方法明明在傳圖下面
02/03 22:24, 3F

02/03 22:28, , 4F
android如果在main thread呼叫一定是用非同步API,完成後才
02/03 22:28, 4F

02/03 22:29, , 5F
繼續是要寫在callback裡,不是下一行
02/03 22:29, 5F

02/03 22:35, , 6F
謝謝s大 callback是個好方法
02/03 22:35, 6F

02/03 22:36, , 7F
不過因為我的程式是用for回圈設變數動態對應不同的圖片數
02/03 22:36, 7F

02/03 22:36, , 8F
02/03 22:36, 8F

02/03 22:38, , 9F
不是一個接一個 所以是否有辦法判斷多個上傳的執行緒都跑
02/03 22:38, 9F

02/03 22:38, , 10F
完後 才跑寫資料庫的方法
02/03 22:38, 10F

02/03 22:53, , 11F
當然可以但是怎麼寫比較簡單要看你用的library和版本
02/03 22:53, 11F

02/03 23:04, , 12F
請問S大有什麼關鍵字或網頁可參考的嗎
02/03 23:04, 12F

02/03 23:05, , 13F
如果library沒,最通用的大概是ExecutorService的invokeAll
02/03 23:05, 13F

02/03 23:09, , 14F
我估狗看看 感謝
02/03 23:09, 14F

02/03 23:12, , 15F
最簡單的作法是CompletableFuture但是要7.0+或用別的lib
02/03 23:12, 15F

02/03 23:17, , 16F
好的 謝謝分享!
02/03 23:17, 16F

02/04 17:15, , 17F
這用countdownlatch 可以實現,但要記得處理好time out與
02/04 17:15, 17F

02/04 17:15, , 18F
異常
02/04 17:15, 18F

02/04 22:01, , 19F
回報一下結果 我用S大說的invokeall 好像跟asyncHttpClie
02/04 22:01, 19F

02/04 22:02, , 20F
會相衝 只要一跑到送POST那行就會停擺
02/04 22:02, 20F

02/04 22:03, , 21F
後來改用AMI大說的COUNTDOWNLATCH 有成功達到我要的效果
02/04 22:03, 21F

02/04 22:03, , 22F
不過奇怪的是我要顯示讀取中的DIALOG他一定要等TASK跑完才
02/04 22:03, 22F

02/04 22:03, , 23F
會出現
02/04 22:03, 23F

02/05 00:34, , 24F
你現在的作法大概是block了main thread...
02/05 00:34, 24F

02/05 00:34, , 25F
要用Executor或Future系列的東西,就不用async client
02/05 00:34, 25F

02/05 00:35, , 26F
直接在Executor的thread上用同步方式執行就好
02/05 00:35, 26F

02/05 00:36, , 27F
然後負責等所有工作完成的(invokeAll/latch的await)也必須
02/05 00:36, 27F

02/05 00:36, , 28F
另起一個thread來做,才不會block main thread
02/05 00:36, 28F

02/05 00:38, , 29F
main thread的觀念是android(其他GUI framework大概也是)
02/05 00:38, 29F

02/05 00:39, , 30F
必須要弄清楚的
02/05 00:39, 30F

02/05 08:17, , 31F
感謝分享!
02/05 08:17, 31F
文章代碼(AID): #1Ob92Toi (java)
文章代碼(AID): #1Ob92Toi (java)