編輯:Android開發實例
在項目開發當中,當用戶點擊一個按鈕時如果執行的是一個非常耗時的操作,處理不好很容易導致系統假死,用戶體驗很差,而Android開發當中則是,如果任意一個Acitivity沒有響應5秒鐘以上就會被強制關閉,因此我們需要另外起動一個線程來處理長耗時操作,而主線程則不受其影響,在耗時操作完結發送消息給主線程,主線程再做相應處理。那麼線程之間的消息傳遞和異步處理用的就是Handler。
下面我們通過一個模擬文件下載的這個長耗時操作來做個說明:
1、新建一個項目 Android_Handler
2、在MainHandler.java中寫如下面內容:
package android.basic.android_handler;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainHandler extends Activity {
//聲明變量
private Button b1;
private ProgressDialog pd;
//定義Handler對象
private Handler handler =new Handler(){
@Override
//當有消息發送出來的時候就執行Handler的這個方法
public void handleMessage(Message msg){
super.handleMessage(msg);
//只要執行到這裡就關閉對話框
pd.dismiss();
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res= this.getResources();
//查看UI組件所在的線程名
Log.i("tag", "onCreate()-->"+Thread.currentThread().getName());
//定義UI組件
b1= (Button)findViewById(R.id.Button01);
//給按鈕綁定單擊事件監聽器
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//點擊按鈕後去處理長耗時操作
processThread();
}
});
}
private void processThread(){
//構建一個下載進度條
pd= ProgressDialog.show(MainHandler.this, "下載文件", "正在下載……");
Log.i("tag", "processThread()-->"+Thread.currentThread().getName());
new Thread(){
@Override
public void run(){
Log.i("tag", "run()-->"+Thread.currentThread().getName());
//在新線程裡執行長耗時方法
longTimeMethod();
//執行完畢後給handler發送一個空消息
handler.sendEmptyMessage(0);
}
}.start();
}
//模擬下載文件的長耗時方法
private void longTimeMethod(){
try {
Log.i("tag", "longTimeMethod-->"+Thread.currentThread().getName());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3、res/layout/main.xml的內容就省略了,可以根據程序運行截圖和程序代碼反推出來布局組件。
4、運行程序查看結果
這個例子裡,在輔助線程的run方法中執行長耗時操作,操作完畢後調用handler.sendEmptyMessage()方法,主線程中的Handler的 handleMessage()方法接受到這一消息,並做了就是關閉對話框的處理。
android實現底部布局往往使用RelativeLayout的布局方式,並且設置android:layout_alignParentBottom=”true”,
繪制圓環其實很簡單,有大概以下三種思路. 這裡先說網上提到的一種方法。思路是先繪制內圓,然後繪制圓環(圓環的寬度就是paint設置的paint.setStroke
系統啟動過程圖: Framework層所有的Service都是運行在SystemServer進程中;SystemServer進程是由Zygote進程創
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩