一、注意事项
- UI线程中使用sleep()会导致页面停止刷新,需要使用则创建新的线程使用
- 非UI线程不允许更改组件的程序,会导致程序崩掉,只有UI线程才被允许
二、读秒器
我们通过读秒器来暴露一些问题 实现效果:当按下开始按键每隔一秒显示加一,加到10
2.1 UI线程使用sleep()
我们可以看到按下按键后,10秒内页面没有任何刷新,直到10秒后才刷新页面,显示0秒变成10秒,原因正是UI线程使用sleep()会导致页面停止刷新
package com.example;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
public TextView test;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test = (TextView) findViewById(R.id.test);
}
public void click(View v) {
int i;
for(i = 1; i < 11; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
test.setText(i+"秒");
}
}
}
2.2 非UI线程更改组件程序
尽然UI线程不能使用sleep(),那创建一个新的线程来使用sleep()不就解决了吗,实则不然,我们会看到按下开始按键,程序立马崩溃,退出APP,原因是创建新的线程来使用sleep()自然没有问题,但是非UI线程是不被允许修改组件程序的会导致程序崩掉
package com.example;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
public TextView test;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test = (TextView) findViewById(R.id.test);
}
public void click(View v) {
new Thread(new Runnable() {
public void run() {
int i;
for(i = 1; i < 11; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
test.setText(i+"秒");
}
}
}).start();
}
}
2.3 修改组件程序正确方式
修改组件程序还是要UI线程来完成,我们通过类Handler的方法实现, 实例Handler对象,对handleMessage()进行重写,将需要刷新页面的代码块放在其中 非UI线程可以通过sendMessage()给UI线程发送信息让UI线程去执行handleMessage()刷新页面
package com.example;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
public TextView test;
public Handler h;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test = (TextView) findViewById(R.id.test);
h = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
test.setText(msg.arg1+"秒");
}
};
}
public void click(View v) {
new Thread(new Runnable() {
public void run() {
int i;
for(i = 1; i < 11; i++) {
try {
Thread.sleep(1000);
Message mesg = new Message();
mesg.arg1 = i;
h.sendMessage(mesg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
注意使用类Handler导的包是android.os.Handler
|