編輯:關於Android編程
Android不允許activity新啟動的線程訪問該activity裡的界面組件,這樣就導致新啟動的線程無法動態改變界面組件的屬性值,但在實際開發中,尤其設計動畫的游戲開發中,需要讓新啟動的線程周期性的改變界面組件的屬性值,這是就需要借助於Handler的消息傳遞機制來實現了。
Handler類的主要作用有兩個:
1. 在新啟動的線程中發送消息
2. 在主線程中獲取、處理消息
這個過程設計一個問題:新啟動的線程何時發送消息呢?主線程何時去獲取並處理消息呢?
為了讓主線程能“適時”地處理新啟動的線程所發送的消息,顯然只能通過回調的方式來實現,開發者需要做的就是,重寫Handler類中處理消息的方法,當新線程發送消息時,Handler類中處理消息的方法將自動被回調。
Handler類的方法比較多,現列舉幾個常用方法:
1、voidhandleMessage(Message msg) ;用於處理消息的方法,該方法通常用於被重寫
2、final boolean hasMessages(int what) :檢查消息隊列中是否包含參數what為指定值的消息
3、final boolean hasMessages(int what, Object object):檢查消息隊列中是否包含參數what為指定值且參數object為指定對象的消息
4、final Message obtainMessage():從消息池中獲取消息
5、final boolean sendEmptyMessage(int what):發送空消息
6、final boolean sendEmptyMessageDelayed(int what, long delayMillis):指定多少毫秒之後發送空消息
7、final boolean sendMessage(Message msg):立即發送消息
8、final boolean sendMessageDelayed(Message msg, long delayMillis):指定多少毫秒之後發送消息
程序通過上面幾個方法,就可以實現方便的實現消息傳遞了!
貼上代碼:
[java]
<SPAN style="FONT-SIZE: 14px">package com.test.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class MainActivity extends Activity {
private int MESSAGE = 1;
private TextView mTextView;
private String temp = "線程每隔2秒處理一次";
private Thread mThread;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.handTextView);
// 僅Thread實現
thread.start();// 啟動線程
// //Runnable實現
// mThread = new Thread(mRunnable);
// mThread.start();
// 這個算是最簡潔的方式了
// mTextView.post(new Runnable() {
//
// @Override
// public void run() {
// Message message=new Message();
// message.what=MESSAGE;
// mHandler.sendMessage(message);
// }
// });
}
// 由Handler的handleMessage方法處理更新ui
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {// 該方法在主線程中運行
super.handleMessage(msg);
switch (msg.what) {
case 1:
mTextView.setText(temp);
break;
default:
break;
}
}
};
// Thread實現
Thread thread = new Thread() {
@Override
public void run() {// 新創建的線程
super.run();
for (int i = 0; i < 100; i++) {
try {
sleep(2000);// 暫停2秒再發送消息
temp = temp + i;
// 第一種發送消息的方式
// Message message = new Message();
// message.what = MESSAGE;
// mHandler.sendMessage(message);
// 第二種發送消息的方式,推薦使用這種
Message message = mHandler.obtainMessage();
mHandler.obtainMessage(MESSAGE).sendToTarget();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
// Runnable實現
Runnable mRunnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(2000);// 暫停2秒再發送消息
temp = temp + i;
// 第一種發送消息的方式
// Message message = new Message();
// message.what = MESSAGE;
// mHandler.sendMessage(message);
// 第二種發送消息的方式,推薦使用這種
Message message = mHandler.obtainMessage();
mHandler.obtainMessage(MESSAGE).sendToTarget();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
}
</SPAN>
關於Handler的總結。 Message:消息,其中包含了消息ID,消息處理對象以及處理的數據等,由MessageQueue統一列隊,終由Handler處理。 H
Android沒有自帶顏色編輯器,為了讓用戶直觀的選擇顏色,做了這麼一個控件,效果圖如下:上方顏色條為主顏色條,用戶可以選擇大致需要的顏色,下方是該顏色的平衡調節,可以調
三星Galaxy S6 Edge推出有一段時間了,受很多用戶的贊揚,不過再好的手機在使用的過程中也會出現一定的問題。比如數據連接問題,手機卡頓滯後問題,攝像
原因:編譯器版本的問題。Java 1.5的編譯器默認對父類的方法進行覆蓋,采用@Override進行說明;但1.6已經擴展到對接口的方法;所以如果還是以Java 1.5