項目中遇到一個狀況,先生成文件再上傳;但有時候發出指令後上傳會不成功,須要再發一次指令方能上傳。html
猜測是因爲文件還沒生成就執行「上傳」指令了。想到要延時。Android中單純用currentThread.sleep()方法好像是不行的,要用「Handler」。java
用如下代碼成功實現延時:android
new Handler().postDelayed(new Runnable(){ public void run() { //顯示dialog } }, 5000); //5秒
補充:API是這麼解釋的:web
「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.htmloop
http://developer.android.com/reference/android/os/Handler.htmlpost
---------------------Mar.26,2014分割線-----------------------spa
今天是Mar.26,2014,從Mars老師的視頻裏摘錄一些Handler的東西:線程
1.Handler負責把消息對象加入到消息隊列尾部;Looper是一個「循環器」,不停地從消息隊列頭部取出消息對象。若是消息隊列中沒有消息對象中,Looper處於等待狀態,有則取出。Looper調用Handler的handleMessage()方法對消息對象進行處理。
好吧,偷懶截個圖吧:
摘自SE02E06的視頻
2.SE02E07,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)。不知怎麼弄。暫時放棄。