对于Handler,平时基本是看代码,这里来实践回顾一下。
UI操作是线程不安全的,多个线程同时进行UI操作会出问题,所以只用主线程去处理UI事件,其他线程需要进行UI操作的时候,就通过Handler去发个消息,通知主线程去处理。主线程按照接收的消息的顺序去进行处理,这就是消息队列。
有时候,不一定是要进行UI操作,也可以使用Handler的消息队列机制。
以下代码中,在click方法中,开启了一个线程用来处理一个耗时操作,
public void onClick(View src)
{
try {
new Thread() {
@Override
public void run(){
for (int i = 0; i < 25600; i++) {
SettingsObserver observer = new SettingsObserver(null);
observer.observe();
}
}
}.start();
} catch (Exception e) {
// TODO: handle exception
}
}
点了按钮后,漫长的等待很无聊,最好在界面上提示下进度,这里准备用个字符串显示循环次数。涉及到了UI操作,Handler就出场了。
public class MainActivity extends ActionBarActivity
implements OnClickListener{
public TextView mTextView;
private Handler mHandler = new Handler();
public long mNum = 0;
private Runnable myRunnable = new Runnable() {
public void run() {
mTextView.setText(mNum + " Observers had been created");
}
};
class SettingsObserver extends ContentObserver {
SettingsObserver(Handler handler) {
super(handler);
}
void observe() {
ContentResolver resolver = getContentResolver();
resolver.registerContentObserver(
Settings.System.getUriFor(Settings.System.ALARM_ALERT), false, this );
updateSettings();
}
@Override
public void onChange(boolean selfChange) {
updateSettings();
}
public void updateSettings() {
}
public void onClick(View src)
{
try {
new Thread() {
@Override
public void run(){
for (int i = 0; i < 25600; i++) {
SettingsObserver observer = new SettingsObserver(null);
observer.observe();
if (i % 100 == 0) {
mNum = i;
mHandler.post(myRunnable);
}
}
}
}.start();
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
Button aButton = (Button)findViewById(R.id.button1);
aButton.setOnClickListener(this);
mTextView = (TextView)findViewById(R.id.textView1);
mTextView.setText(0 + " Observers had been created");
/* if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}*/
}