編輯: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();
}
做Android 系統/應用開發需要掌握自動化測試知識
接觸Andorid有幾個月了,一直認為做系統,應用開發根本不需要懂 Android自動化測試之道,認為那都是測試人員需要掌握的東西,我們只要懂開發,只要讀懂系統,根據客戶
對於android源碼的一些看法
1.背景即將結束在sony移動的實習了,在最後的日子有一些傷感有一些感觸,對於android這個傾注一年心血的技術有太多話要說。感謝sony移動的各位大牛們給我這個機會,
android聯系人信息的存儲結構
在新的Contacts API中,聯系人數據被放到三張表中:Contacts、RawContacts和Data。這樣可以幫助系統更好地存儲與管理一個聯系人的多個帳戶的信息
Android 4.4 KitKat:Nexus 4已被ROM開發者率先適配
不得不承認,這是個高效率的時代!從刷機精靈微博了解到,上周五,Google發布了Android4.4的源碼,這不,剛過了一天,Nexus 4機型的4.4 ROM就已經率先