子線程更新主線程UI操作的幾種方法:
//定義handler
static final int SUCCESS = 1;
static final int FAIL = 0;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SUCCESS:
Toast.makeText(MyActivity.this, msg.getData().get("msg").toString(), Toast.LENGTH_SHORT).show();
break;
case FAIL:
Toast.makeText(MyActivity.this, msg.getData().get("msg").toString(), Toast.LENGTH_SHORT).show();
break;
default:
super.handleMessage(msg);
}
}
};
//方法一:通過handler.sendMessage,更新UI主線程
private void makeToastByHandlerSendMessage(String msgStr) {
Message msg = new Message();
msg.what = 0;
Bundle bundle = new Bundle();
bundle.putString("msg", msgStr);
msg.setData(bundle);
handler.sendMessage(msg);
}
//方法二:通過handler.post,更新UI主線程
private void makeToastByHandlerPost(final String msg) {
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
}
//方法三:通過handler.post,延遲seconds秒後更新UI主線程
private void makeToastByHandlerPostDelay(final String msg, int seconds) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show();
}
}, seconds * 1000);
}
//方法四:使用runOnUiThread,更新UI主線程
private void makeToastByRunOnUiThread(final String msg) {
MyActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
}
//方法五:通過view.post,更新UI主線程
private void makeToatByViewPost(View view, final String msg) {
view.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
}
//方法六:通過AsyncTask,更新UI主線程
private void makeToastByAysncTask(final String msg) {
AsyncTask asyncTask = new AsyncTask() {
@Override
protected Object doInBackground(Object[] params) {
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show();
}
@Override
protected void onProgressUpdate(Object[] values) {
super.onProgressUpdate(values);
}
};
asyncTask.execute();
}
使用方法:
//1、Handler.SendMessage
makeToastByHandlerSendMessage(msg);
//2、Handler.Post
makeToastByHandlerPost(msg);
//3、Handler.PostDelay
makeToastByHandlerPostDelay(msg,1);
//4、context.RunOnUiThread
makeToastByRunOnUiThread(msg);
//5、View.Post
makeToatByViewPost(btnLogin,msg);
//6、AysncTask
makeToastByAysncTask(msg);
其實通過查看源代碼,發現非handler的實現方法最終還是通過handler來實現的。
MyActivity.this.runOnUiThread(new Runnable() {
});
view.post(new Runnable());
// 以上兩個方法最終都調用handler的sendMessageDelayed方法
public final boolean sendMessageDelayed(Message msg, long delayMillis)