編輯:Android開發教程
大家都知道,在PC上的應用程序當需要進行一些復雜的數據操作,但不需要界面UI的時候 ,我們會為應用程序專門寫一個線程去執行這些復雜的數據操作。通過線程,可以執行例如 :數據處理、數據下載等比較耗時的操作,同時對用戶的界面不會產生影響。在Android應用 程序開發中,同樣會遇到這樣的問題。當我們需要訪問網絡,從網上下載數據並顯示在我們 的UI上時,就會啟動後台線程去下載數據,下載線程執行完成後將結果返回給主用戶界面線 程。
對於線程的控制,我們將介紹一個Handler類,使用該類可以對運行在不同線程中的多個 任務進行排隊,並使用Message和Runnable對象安排這些任務。在javadoc中,對Handler是這 樣解釋的:Handler可以發送和處理消息對象或Runnable對象,這些消息對象和Runnable對象 與一個線程相關聯。每個Handler的實例都關聯了一個線程和線程的消息隊列。當創建了一個 Handler對象時,一個線程或消息隊列同時也被創建,該Handler對象將發送和處理這些消息 或Runnable對象。
下面有幾種對Handler對象的構造方法需要了解一下:
a、如果new一個無參構造函數的Handler對象,那麼這個Handler將自動與當前運行線程相 關聯,也就是說這個Handler將與當前運行的線程使用同一個消息隊列,並且可以處理該隊列 中的消息。
private Handler handler = new Handler();
我們做這樣一個實驗,在主用戶界面中創建一個帶有無參構造函數的Handler對象,該 Handler對象向消息隊列推送一個Runnable對象,在Runnable對象的run函數中打印當前線程 Id,我們比較主用戶界面線程ID和Runnable線程ID是否相同。具體代碼如下:
HandlerTest01
public class HandlerTest01 extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView(R.layout.main);
System.out.println("Activity ---> " + Thread.currentThread().getId());
handler.post(r);
}
private Handler handler = new Handler();
private Runnable r = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println ("Runnalbe ---> " + Thread.currentThread().getId());
}
};
}
當用戶與視圖views進行交互的時候,views也會觸發事件。舉個例子,當用戶點擊了一個按鈕,你需要為 這個事件服務,只有這樣,才能去執行某些適當的行為。如果想這麼做的話
上周谷歌版Galaxy S4(GT-I9505)的Android 4.3 Jelly Bean刷機包流出,也讓我們初步了解了Android 4.3的一些新特性。那麼,An
當執行某些正在處理的任務時,ProgressBar提供了一個可視化的反饋。例如,你在從web服務器下載數據 ,然後需要更新下載的狀態。在這種情況下,ProgressBar
想要理解ContentProvider的最佳方式就是自己動手去嘗試一下。下面介紹如何使用一個內置的Contacts ContentProvider。1. 創建一個工程,P