Android应用开发:在子线程更新UI主线程详情方法
小标 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
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved