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

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

Links booklink

Contact Us: admin [ a t ] ucptt.com