1. 通過Handler機制:
private void one() {
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 123:
tv.setText(""+msg.obj);//textview刷新
break;
}
}
};
new Thread(){
@Override
public void run() {
super.run();
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Message message=Message.obtain();
message.what=123;
message.obj="通過Handler機制";
handler.sendMessage(message);
}
}.run();
}
主線程中定義Handler,子線程發消息,通知Handler完成UI更新,Handler對象必須定義在主線程中,如果是多個類直接互相調用,就不是很方便,需要傳遞content對象或通過接口調用。另外Handler機制與Activity生命周期不一致的原因,容易導致內存泄漏,使用時需要注意。
2. runOnUiThread方法
private void two(){
new Thread(){
@Override
public void run() {
super.run();
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText("通過runOnUiThread方法");
}
});
}
}.run();
}
用Activity對象的runOnUiThread方法更新,在子線程中通過runOnUiThread()方法更新UI,強烈推薦使用。
3. View.post(Runnable r) :
private void three(){
new Thread(){
@Override
public void run() {
super.run();
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
tv.post(new Runnable() {
@Override
public void run() {
tv.setText("通過View.post(Runnable r) 方法");
}
});
}
}.run();
}
這種方法更簡單,但需要傳遞要更新的View過去,也可以使用。
4. AsyncTask
private void four(){
new MyAsyncTask().execute("通過AsyncTask方法");
}
private class MyAsyncTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] objects) {
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return objects[0].toString();
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
tv.setText(o.toString());
}
}