1.Handler方式
—————-复写handler的handleMessage方式——————-
//在UI线程中创建Handler对象
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
//根据Message的内容做相应的更新(一般使用msg.what,也可进行数据传递)
}
}
//在非UI线程中(子线程)使用Handler发送更新消息
int UPDADE_UI = 1;
Messager msg = Message.obtain();
msg.what = UPDATE_UI;
mHandler.sendMessage(msg);
—————-handler.post方式——————-
//在UI线程中创建Handler对象
private Handler handler = new Handler();
//在子线程中调用Handler对象更新
handler.post(new Runnable() {
@Override
public void run() {
//在此处直接更新UI,例如mText.setText("更新");
}
});
2.AsyncTask
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
}
//onPostExecute()方法内可直接更新UI
@Override
protected void onPostExecute(Void aVoid) {
//在此处可直接执行更新UI的操作
}
}.execute();
3.view.post
将一个Runnable添加到消息队列,Runnable将在UI线程运行。
This method can be invoked from outside of the UI thread only when this View is attached to a window.即必须保证该View被添加到窗口。
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.btn_show);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
//此处处于子线程内
button.post(new Runnable() {
@Override
public void run() {
button.setText("liuconen");
}
});
}
}).start();
}
});
4.Activity.runOnUiThread(Runnable)方式
public final void runOnUiThread (Runnable action)
在UI线程中执行,如果当前线程是UI线程是UI线程,动作将被立即执行; 如果当前线程不是UI线程,动作将被发送到UI线程的消息队列(按照消息队列的顺序执行)
示例:
button = (Button) findViewById(R.id.btn_show);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
//此处直接更新UI
button.setText("liuconen");
}
});
}
}).start();
}
});