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