当前位置: 移动技术网 > IT编程>移动开发>Android > android在子线程更新UI主线程详情方法

android在子线程更新UI主线程详情方法

2018年01月13日  | 移动技术网IT编程  | 我要评论

定州新闻,曹娥,整洁宝典

最近用了一下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)

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网