很多網友在Android中使用多執行緒UI相關內容時可能會發現Logcat提示Only the original thread that
created a view hierarchy can touch its
views這樣的錯誤,這主要是Android的相關View和控制項不是安全執行緒的,我們必須做獨立的處理這點比J2ME麻煩一些,這裡Android給我們提供了很多方法,有關線程的,我們需要瞭解下J2ME中一些傳統的線程建立方法,比如Runnable或直接new
Thread(),大家需要瞭解UI線程、worker線程以及一些概念。今天android開發網說一種簡單的方法除了非同步任務AsyncTask外使用Handler可以很好的處理,和Win32的訊息很像。
首先我們需要明白,主線程或者這裡說的原始線程original thread
一般情況下是UI線程,當然UI線程並不一定是主線程,我們不能長時間的阻塞該應用,在Android平台上可能會產生類似Force
close或Wait這樣的對話方塊這裡我們成為ANR,這裡除了使用ProgressDialog方式給用一個動態進度代表當前處理並沒有中斷可能需要
一些時間,所以android123告訴大家相關的網路處理可以使用工作者線程,但是worker 線程不能處理顯示元素即UI相關的View或
Widget包中的高層的控制項,所以通過一個Handler對象可以很好的傳遞Runnable或Message ,下面我們用一個簡單的例子來描述
final Handler cwjHandler = new Handler();
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateUI();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
NetworkOperation();//一個很費時間的I/O操作,比如網路或檔案讀寫等等。
}
protected void NetworkOperation() {
Thread t = new Thread() {
public void run() {
doSomething(); //處理得到結果了,這裡一些內容儲存在主類的成員變數中
cwjHandler.post(mUpdateResults); //高速UI線程可以更新結果了
}
};
t.start();
}
private void updateUI() {
//詳細的更新
}
使用以上方法,屏蔽adobe flash player載入flash的閃動現象,並不能很好的解決,flash載入閃動仍存在,但是這個線程方法本身是沒問題的。希望能解決flash抖動現象的人提建議或方案。具體代碼架構如下,
1、監聽事件,載入flash
forwardbtn.setOnClickListener(new ImageButton.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
mImgView.setVisibility(View.VISIBLE);
loadFlash();
//create thread
createImgviewThread();
}
});
線程函數:
private void createImgviewThread(){
//start a thread
new Thread(new Runnable(){
//@Override
public void run() {
try {
Thread.sleep(2000);
}catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// TODO Auto-generated method stub
mHandler.post(new Runnable(){
//@Override
public void run() {
// TODO Auto-generated method stub
mWebView.setVisibility(View.VISIBLE);
}});
}
}).start();
}
參考:http://java-admin.javaeye.com/blog/789849