小标
2018-05-23
来源 :
阅读 1601
评论 0
摘要:在Android应用开发中,最近用了一下okhttp,原本以为异步callback里面的onResponse是运行在主线程的,后面发现在onResponse里面放了Toast,半天没有反映,一度以为Toast写错了,把Toast放外面发现可以正常弹出提示的,后来查了下资料,原来okhttp的callback,onResponse其实还是运行在子线程的,那么如果在子线程更新主线程呢。这里提供几种方法。希望对大家学习Android应用开发有所帮助。
在Android应用开发中,最近用了一下okhttp,原本以为异步callback里面的onResponse是运行在主线程的,后面发现在onResponse里面放了Toast,半天没有反映,一度以为Toast写错了,把Toast放外面发现可以正常弹出提示的,后来查了下资料,原来okhttp的callback,onResponse其实还是运行在子线程的,那么如果在子线程更新主线程呢。这里提供几种方法。希望对大家学习Android应用开发有所帮助。
//定义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)本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发Android频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号