android更新ui能在主线程,android在子线程更新UI主线程的六种方法(全网最全)

最近用了一下okhttp,本来觉得异步callback里面的onResponse是运行在主线程的,后面发如今onResponse里面放了Toast,半天没有反映,一度觉得Toast写错了,把Toast放外面发现能够正常弹出提示的,后来查了下资料,原来okhttp的callback,onResponse其实仍是运行在子线程的,那么若是在子线程更新主线程呢。这里提供几种方法。java

//定义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(LoginActivity.this, msg.getData().get("msg").toString(), Toast.LENGTH_SHORT).show();

break;

case FAIL:

Toast.makeText(LoginActivity.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(LoginActivity.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(LoginActivity.this, msg, Toast.LENGTH_SHORT).show();

}

},seconds*1000);

}

//方法四:使用runOnUiThread,更新UI主线程

private void makeToastByRunOnUiThread(final String msg)

{

LoginActivity.this.runOnUiThread(new Runnable() {

@Override

public void run() {

Toast.makeText(LoginActivity.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(LoginActivity.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(LoginActivity.this, msg, Toast.LENGTH_SHORT).show();

}

@Override

protected void onProgressUpdate(Object[] values) {

super.onProgressUpdate(values);

}

};

asyncTask.execute();

}              调用:

//一、Handler.SendMessage

makeToastByHandlerSendMessage(msg);

//二、Handler.Post

makeToastByHandlerPost(msg);

//三、Handler.PostDelay

makeToastByHandlerPostDelay(msg,1);

//四、context.RunOnUiThread

makeToastByRunOnUiThread(msg);

//五、View.Post

makeToatByViewPost(btnLogin,msg);

//六、AysncTask

makeToastByAysncTask(msg);

其实经过查看源代码,发现非handler的实现方法最终仍是经过handler来实现的。

LoginActivity.this.runOnUiThread(new Runnable() {});

view.post(new Runnable() );

//以上两个方法最终都调用handler的sendMessageDelayed方法

public final boolean sendMessageDelayed(Message msg, long delayMillis)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值