1. Android進程 android
一個應用程序被啓動時,系統默認建立執行一個叫作"main"的線程。這個線程也是你的應用與界面工具包(android.widget和android.view包中的組件)交互的地方。因而main線程也被稱爲界面線程。 數據庫
這種單線程的模式會帶來低性能,除非你能正確的優化你的程序。 安全
打 個比方:用戶觸摸屏幕上的一個按鈕時的點擊事件即向線程中派發事件,好比每個事件爲一輛車。而每一條線程都好像是一條單行線的單車道。這條車道上的車量 都排成隊行駛至收費口進行事件處理。當處理的事件繁瑣,好比在響應用戶交互時需執行大量運算,或者像是執行網絡鏈接、數據庫請求這樣耗時的操做。就會形成 擁堵,將會阻止整個界面的響應。當線程被阻塞時,就不能派發事件了。從用戶的角度看,程序反應太慢了。甚至更糟的是,若是界面線程被阻塞幾秒鐘(大5秒鐘 吧),用戶就戶抱怨說程序沒反應了,用戶可能於是退出並刪掉你的應用。 此外,Andoid界面不是線程安全的。因此你毫不能在一個工做線程中操做你的界面—你只能在界面線程中管理的你的界面。因此,對於單線程模式有兩個簡單 的規則 網絡
1不要阻塞界面線程 ide
2不要在界面線程以外操做界面。 工具
2. 工做線程 post
因爲上述的單線程模式,不要阻塞你的界面線程以使你的應用的界面保持響應是很是重要的,那麼若是你有不能很快完成的任務,你應把它們放在另外一個線程中執行(後臺線程或工做線程)。 性能
例如,下面是的代碼是響應click事件,在另一個線程中從網絡獲取資源文字並以TextView來顯示。 優化
mHandle.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
// 耗時操做
loadNetWork();
mTextView.setText(來自網絡的文字);
}
});
}
}); this
第一眼,這看起來能很好的工做,由於它建立了一個新線程來進行網絡操做。然而它違反了第二條規則:不要在界面線程以外操做界面—它簡單的在工做線程中修改了mTextView。這會導至未定義的異常出現,而且難以調試追蹤。
爲了能改正這個問題,Android提供了不少從其它線程來操做界面的方法。下面是可用的方法們:
1 Activity.runOnUiThread(Runnable)
2 View.post(Runnable)
3 View.postDelayed(Runnable,long)
4 Handler
5 AsyncTask
如今咱們就依次使用這幾個方法:
一、Activity.runOnUiThread(Runnable)
mHandle.setOnClickListener(new OnClickListener() { mHandle.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
// 耗時操做
loadNetWork();
mTextView.post(new Runnable() {
@Override
public void run() {
mTextView.setText(來自網絡的文字);
}
});
}
});
}
});
三、View.postDelayed(Runnable,long)
mHandle.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
// 耗時操做
loadNetWork();
mTextView.postDelayed(new Runnable() {
@Override
public void run() {
mTextView.setText(來自網絡的文字);
}
}, 10);
}
});
}
});
四、Handler(子線程調用Handler的handle.sendMessage(msg);
Handler handle = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mTextView.setText(來自網絡的文字);
}
};
class MyThread extends Thread {
@Override
public void run() {
// 耗時操做
loadNetWork();
Message msg = new Message();
handle.sendMessage(msg);
super.run();
}
}
五、AsyncTask
主線程中:aTask ak = new aTask();
ak.execute();
而後:
private class aTask extends AsyncTask { //後臺線程執行時 @Override protected Object doInBackground(Object... params) { // 耗時操做 return loadNetWork(); } //後臺線程執行結束後的操做,其中參數result爲doInBackground返回的結果 @Override protected void onPostExecute(Object result) { super.onPostExecute(result); mTextView.setText(result); } }