項目中遇到一個情況,先生成文件再上傳;但有時候發出指令后上傳會不成功,需要再發一次指令方能上傳。
猜想是由於文件還沒生成就執行「上傳」指令了。想到要延時。Android中單純用currentThread.sleep()方法好像是不行的,要用「Handler」。
用以下代碼成功實現延時:
new Handler().postDelayed(new Runnable(){ public void run() { //顯示dialog } }, 5000); //5秒
補充:API是這么解釋的:
「There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.」
參考:
http://www.cnblogs.com/meieiem/archive/2011/11/11/2245245.html
http://developer.android.com/reference/android/os/Handler.html
---------------------Mar.26,2014分割線-----------------------
今天是Mar.26,2014,從Mars老師的視頻里摘錄一些Handler的東西:
1.Handler負責把消息對象加入到消息隊列尾部;Looper是一個「循環器」,不停地從消息隊列頭部取出消息對象。如果消息隊列中沒有消息對象中,Looper處於等待狀態,有則取出。Looper調用Handler的handleMessage()方法對消息對象進行處理。
好吧,偷懶截個圖吧:
摘自SE02E06的視頻
2.SE02E07,Handler(上)講得是,他打算實現:
- 通過Handler實現線程間通信
- 在主線程中實現Handler的HandleMessage()方法
- 在WorkerThread中通過Handler發送消息
於是他在MainActivity中寫了一個NetworkThread extends Thread,在里面的run()方法中他先讓線程sleep兩秒鍾(模擬訪問網絡),然后定義一個String s,嘗試把s賦值給前面定義好的textView中,用「textView.setText(s);」,他提到這樣是不行的,因為「只能在UI線程MainThread中操作控件。」而這個線程屬於workerThread,操作會報異常,RunThreadException。
解決方法是:
在run()方法中加入:
Message msg = handler.obtainMessage();
msg.obj = s ; //sendMessage()方法,在主線程或是worker thread中發送都是可以的 handler.sendMessage(msg);
Looper從消息隊列中取出之后在主線程中執行。在生成handler對象的Myhadler 中得到String s = (String)msg.obj;。這就實現了在workerThread和MainThread中通信。這時候再更新UI:textView.setText(s);即可。
讀取SD卡文件,訪問網絡,完成復雜運算等等。。需要開辟新線程的操作,可以把結果賦值給msg,用Handler發送出去,然后在主線程中得到msg中的數據,再更新到UI上面。
-----------------Mar.27,2014------------------------
想寫卻沒來的及寫,試了下RC4算法。 WHAT DID I DO TODAY!!!!
-----------------May.15,2014------------------------
最近用了handler在不同線程之間傳值,發現:
1.handler傳值一定是在不同線程之間,否則會報錯。
2.handler的handleMessge()方法,會在另一個線程的sendMessage()方法執行之后,也就是消息發出之后,才會自動執行。
3.在Thread是MainActivity的內部類的時候,總是可以的傳值的;但是實際應用中把Thread寫成了一個單獨的java文件FirstThread.java,於是在FirstThread.java中,寫了:
Message msg = handler.obtainMessage();
msg.obj = result;
handler.sendMessage(msg);
而在MainActivity的handleMessage方法中想要同樣用String s = (String) msg.obj;得到FirstThread中發送的值,可是發現得不到(handleMessage方法不執行,說明隊列中沒有msg)。不知怎么弄。暫時放棄。