在非主UI线程更新视图,常用这两种方法。
对于第一种方法,是采用传递消息的方式,调用Handler中方法来处理消息更新视图。这种方式对于不是很频繁的调用是可取的。如果更新的较快,则消息处理会一直排队处理,这样显示会相对滞后。这个时候就可以考虑使用第二中方式,将需要执行的代码放到Runnable的run方法中,然后调用runOnUiThread()这个方法将Runnable的对象传入即可。
子类需要继承Handler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据
以下示例,实现了两个计数功能:
public class MainActivity extends Activity {
private TextView mTextView1,mTextView2;
//“信使”
private Handler mHandler = new Handler() {
//覆盖此方法,此方法用于接收发来的消息
public void handleMessage(android.os.Message msg) {
//处理子线程发送来的消息
switch (msg.what) {
case 1:
//取出信息中的内容
String text1 = (String) msg.obj;
//主线程执行UI操作,设置到UI上
mTextView1.setText(text1);
break;
case 2:
//取出信息中的内容
String text2 = (String) msg.obj;
//主线程执行UI操作,设置到UI上
mTextView2.setText(text2);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView1 = (TextView) findViewById(R.id.text1);
mTextView2 = (TextView) findViewById(R.id.text2);
//启动一个子线程
new Thread() {
public void run() {
for(int i=0;i<10;i++) {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//发送消息数据给主线程
Message message = Message.obtain(); //尽量可以重用对象
//使用一个int值来区分消息类型
message.what = 1;
//设置消息内容
message.obj = "计次:"+i;
//使用Handler对象发送消息
mHandler.sendMessage(message);
}
}
}.start();
//启动一个子线程
new Thread() {
public void run() {
for(int i=0;i<20;i++) {
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//发送消息数据给主线程
Message message = Message.obtain(); //尽量可以重用对象
//使用一个int值来区分消息类型
message.what = 2;
//设置消息内容
message.obj = "计次:"+i;
//使用Handler对象发送消息
mHandler.sendMessage(message);
}
}
}.start();
}
}
利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程
public class MainActivity extends Activity {
private TextView mTextView1, mTextView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView1 = (TextView) findViewById(R.id.text1);
mTextView2 = (TextView) findViewById(R.id.text2);
// 启动一个子线程
new Thread() {
public void run() {
for (int i = 0; i < 10; i++) {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 创建一个专门用于赋值的变量
final int count = i;
// 切换到主线程中执行
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView1.setText("计数:" + count);
}
});
}
}
}.start();
// 启动一个子线程
new Thread() {
public void run() {
for (int i = 0; i < 20; i++) {
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 创建一个专门用于赋值的变量
final int count = i;
// 切换到主线程中执行
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView2.setText("计数:" + count);
}
});
}
}
}.start();
}
}