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

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

//定义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();

}              调用:

//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来实现的。

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

view.post(new Runnable() );

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

public final boolean sendMessageDelayed(Message msg, long delayMillis)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值