編輯:Android開發實例
andriod提供了 Handler 和 Looper 來滿足線程間的通信。例如一個子線程從網絡上下載了一副圖片,當它下載完成後會發送消息給主線程,這個消息是通過綁定在主線程的Handler來傳遞的。
在Android,這裡的線程分為有消息循環的線程和沒有消息循環的線程,有消息循環的線程一般都會有一個Looper,這個是android的新概念。我們的主線程(UI線程)就是一個消息循環的線程。針對這種消息循環的機制,我們引入一個新的機制Handler,我們有消息循環,就要往消息循環裡面發送相應的消息,自定義消息一般都會有自己對應的處理,消息的發送和清除,把這些都封裝在Handler裡面,注意Handler只是針對那 些有Looper的線程,不管是UI線程還是子線程,只要你有Looper,我就可以往你的消息隊列裡面添加東西,並做相應的處理。
但是這裡還有一點,就是只要是關於UI相關的東西,就不能放在子線程中,因為子線程是不能操作UI的,只能進行數據、系統等其他非UI的操作。
class ChildThread extends Thread {
public void run() {
/*
* 創建 handler前先初始化Looper.
*/
Looper.prepare();
/*
* 在子線程創建handler,所以會綁定到子線程的消息隊列中
*
*/
mChildHandler = new Handler() {
public void handleMessage(Message msg) {
/*
* Do some expensive operations there.
*/
}
};
/*
* 啟動該線程的消息隊列
*/
Looper.loop();
}
}
當Handler收到消息後,就會運行handleMessage(…)的回調函數,可以在裡面做一些耗時的操作。
最後完成了操作要結束子線程時,記得調用quit()來結束消息循環隊列。
mChildHandler.getLooper().quit();
下面是一個線程間通信的小例子:
public class MainThread extends Activity {
private static final String TAG = "MainThread";
private Handler mMainHandler, mChildHandler;
private TextView info;
private Button msgBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
info = (TextView) findViewById(R.id.info);
msgBtn = (Button) findViewById(R.id.msgBtn);
mMainHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i(TAG, "Got an incoming message from the child thread - "
+ (String) msg.obj);
// 接收子線程的消息
info.setText((String) msg.obj);
}
};
new ChildThread().start();
msgBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mChildHandler != null) {
//發送消息給子線程
Message childMsg = mChildHandler.obtainMessage();
childMsg.obj = mMainHandler.getLooper().getThread().getName() + " says Hello";
mChildHandler.sendMessage(childMsg);
Log.i(TAG, "Send a message to the child thread - " + (String)childMsg.obj);
}
}
});
}
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "Stop looping the child thread's message queue");
mChildHandler.getLooper().quit();
}
class ChildThread extends Thread {
private static final String CHILD_TAG = "ChildThread";
public void run() {
this.setName("ChildThread");
//初始化消息循環隊列,需要在Handler創建之前
Looper.prepare();
mChildHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i(CHILD_TAG, "Got an incoming message from the main thread - " + (String)msg.obj);
try {
//在子線程中可以做一些耗時的工作
sleep(100);
Message toMain = mMainHandler.obtainMessage();
toMain.obj = "This is " + this.getLooper().getThread().getName() +". Did you send me \"" + (String)msg.obj + "\"?";
mMainHandler.sendMessage(toMain);
Log.i(CHILD_TAG, "Send a message to the main thread - " + (String)toMain.obj);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Log.i(CHILD_TAG, "Child handler is bound to - "+ mChildHandler.getLooper().getThread().getName());
//啟動子線程消息循環隊列
Looper.loop();
}
}
}
這篇文章主要介紹了Android字段驗證的實例代碼的相關資料,代碼簡單易懂,具有參考借鑒價值,需要的朋友可以參考下 先給大家展示效果圖:
這是個很簡單的問題,但每次隔一段時間後使用起來總是會出點亂子。這裡記錄下Logcat的步驟:1,在Activity裡申明tag變量(名字其實是隨便的,如下:pri
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
在軟件開發過程中,程序代碼的復用,是非常重要的概念。我們總是需要使用一些現有的模塊、包、框架,或開發自己的模塊、包、框架,來實現對程序代碼的復用。比如在JavaW