对子线程更新UI的方法进行了了解,大概可以分以下几种方式,其实本质上都是通过Handler来对UI进行更新,只是变表现手法有所不同。
1. 通过UI 线程中的 handler.post (new runnable(){ }) 的方法进行UI的更新;
2. 常见的handler.sendMessage()
3. runOnUiThread(new runnable(){}) 进行UI的更新;
4. View.post(new Runnable(){})进行UI的更新
下面用代码进行各种更新方法实现:
代码中分了四个按键进行操作,每个按键都会起一个子线程,并进行更新UI的操作
四种方法,都一一展现出来
package com.example.handleruidemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private Button handlerPost, handlerSendMsg, runUiThread, viewPost;
private TextView tV;
private Handler handlerPostHandler = new Handler();
private Handler handlerSendMsgHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
tV.setText("handlerSendMsg OK");
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
handlerPost = (Button) findViewById(R.id.handlerPost);
handlerSendMsg = (Button) findViewById(R.id.handSendmessage);
runUiThread = (Button) findViewById(R.id.runUiThread);
viewPost = (Button) findViewById(R.id.ViewPost);
tV = (TextView) findViewById(R.id.textView1);
handlerPost.setOnClickListener(this);
handlerSendMsg.setOnClickListener(this);
runUiThread.setOnClickListener(this);
viewPost.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
// 利用UI的handler的 Post方法
case R.id.handlerPost:
new Thread() {
public void run() {
System.out.println(Thread.currentThread().getName() + "------ handlerPost");
//重点在这里
handlerPostHandler.post(new Runnable() {
@Override
public void run() {
// 实际运行就是在UI线程,所以可以更新UI操作
System.out.println(Thread.currentThread().getName()+ "---handlerPost check");
tV.setText("handlerPost OK");
}
});
};
}.start();
break;
// 一般的 sendMessage的方法
case R.id.handSendmessage:
new Thread() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "---handSendMsg Check");
Message msg = new Message();
msg.what = 1;
//重点在这里
handlerSendMsgHandler.sendMessage(msg);
}
}.start();
break;
// runUiThread 的方法
case R.id.runUiThread:
new Thread() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+ "---runUiThread Check");
//重点在这里
runOnUiThread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName()+ "---runUiThread Check");
tV.setText("runUiThread Check");
}
});
}
}.start();
break;
// ViewPost 的方法和 handler.post的方法有点类似
case R.id.ViewPost:
new Thread() {
public void run() {
System.out.println(Thread.currentThread().getName()+ "------ ViewPost Check");
//重点在这里
tV.post(new Runnable() {
@Override
public void run() {
// 实际运行就是在UI线程,所以可以更新UI操作
System.out.println(Thread.currentThread().getName()+ "---ViewPost check");
tV.setText("ViewPost OK");
}
});
};
}.start();
break;
default:
break;
}
}
}