編輯:Android開發教程
你是不是經常看到很多書籍中說:不能在子線程中操作ui,不然會報錯。你是不是也遇到了如下的疑惑(見下面的代碼):
(Bundle savedInstanceState) { .onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); Thread.currentThread().setName(); LooperThread().start(); } { () { Thread.currentThread().setName(); tv.setText(); } }
上面確實在子線程中操作ui了,但是他並不會報錯,為什麼呢?這不是跟書上的說法剛好相悖嗎?當時自己也是遇到了這個問題,所以有了這篇博客,感謝網絡上的那些前輩們的無私分享,現將自己的整理和思考記錄下來。
在Android開發過程中,常需要更新界面的UI。而更新UI是要主線程來更新的,即UI線程更新。如果在主線線程之外的線程中直接更新頁面顯示常會報錯。拋出異常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.怎麼解決呢?下面我會詳細列出子線程更新ui的方法:
主線程中定義Handler,子線程發消息,通知Handler完成UI更新。
mHandler = Handler() { (Message msg) { myText.setText( 來自網絡的信息); .handleMessage(msg); } }; { () { loadNetWork(); Message msg = Message(); mHandler.sendMessage(msg); } }
handler的原理圖如下:
這個最好用, 凡是要刷新頁面的地方,都可以按照如下方式寫。
Thread() { () { runOnUiThread( Runnable(){ () { imageView.setImageBitmap(bitmap); } }); } }.start();
這種方法使用比較靈活,但如果Thread定義在其他地方,需要傳遞Activity對象(通過構造函數傳遞)。
方法解釋:從Runnable派生你的子類,重載run()方法。然後調用View.post(myRunnableObj)即可把你的Runnable對象增加到UI線程中運行。
( View v ) { Thread( Runnable() { () { loadNetWork(); myText.( Runnable() { myText.setText( 來自網絡的信息); }); } }).start(); }
接觸Andorid有幾個月了,一直認為做系統,應用開發根本不需要懂 Android自動化測試之道,認為那都是測試人員需要掌握的東西,我們只要懂開發,只要讀懂系統,根據客戶
1.背景即將結束在sony移動的實習了,在最後的日子有一些傷感有一些感觸,對於android這個傾注一年心血的技術有太多話要說。感謝sony移動的各位大牛們給我這個機會,
在新的Contacts API中,聯系人數據被放到三張表中:Contacts、RawContacts和Data。這樣可以幫助系統更好地存儲與管理一個聯系人的多個帳戶的信息
不得不承認,這是個高效率的時代!從刷機精靈微博了解到,上周五,Google發布了Android4.4的源碼,這不,剛過了一天,Nexus 4機型的4.4 ROM就已經率先