美文网首页Android学习Android开发经验谈程序员
Android中使用异步线程更新UI视图的几种方法

Android中使用异步线程更新UI视图的几种方法

作者: 八怪不姓丑 | 来源:发表于2017-08-21 16:35 被阅读193次

    在Android中子线程是不能更新ui的。

    所以我们要通过其他方式来动态改变ui视图,

    1、runOnUiThread

    activity提供的一个轻量级更新ui的方法,在Fragment需要使用的时候要用getActivity.runOnUiThread开启线程
    这种方法最简单,方便更新一些不需要判断的通知,比如在聊天项目中动态获取未读消息数量。

           runOnUiThread(new Runnable() {
                @Override
                public void run() {
                        sendMessage("[自动回复]你好,我是机器人");
                  
                }
    
            });
    

    2、Handler message

    使用这个方法可以设置比如按钮倒计时的控制,也是比较常见的一种更新ui的方法。

    创建一个主线程用于接收子线程不断发送的消息,通过msg.what判断传递的消息类型。
    根据类型进行相关ui的更新操作。

    创建线程用于接收:

     private Handler mHandler = new Handler() {
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case 0:
                        setResult(RESULT_OK);
                        TimerButtonActivity.this.finish();
                        break;
                    case 4:
                        mTimer1.setEnabled(false);
                        mTimer1.setText("已发送(" + String.valueOf(time) + ")");
                        break;
                    case 5:
                        mTimer1.setEnabled(true);
                        mTimer1.setText("重新获取验证码");
                        time = 10;
                        break;
                }
    
            }
        };
    
    

    发送消息的方法:

    mHandler.sendEmptyMessage(5);
    

    3、Handler Runnable

    同样也是需要先创建一个线程。

        Handler handler = new Handler();
    
    

    在一开始加载的地方使用postDelayed设置加载延迟

            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    updataData();
                }
            }, 2000);
    
    

    或者我们要进行一个自动刷新的动作,当动作完成时,隐藏刷新效果

     //开启一个刷新的线程
            mFragmentMainRf.post(new Runnable() {
                @Override
                public void run() {
                    //开始
                    mFragmentMainRf.setRefreshing(true);
                }
            });
            //监听刷新状态操作
            mFragmentMainRf.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    //设置延迟刷新时间1500
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            //刷新数据
                            updataData();
                        }
                    }, 1800);
                }
            });
    

    4、AsyncTask

    AsyncTask可以更加轻松地使用UI线程。该类允许执行后台操作并在UI线程上更新视图,而不需要操纵线程和处理程序。
    AsyncTask被设计为一个辅助类Thread,Handler 并且不构成通用线程框架。用于短时间更新操作。
    在使用的时候需要继承AsyncTask并重写方法:
    doInBackground:用于返回结果
    onProgressUpdate: onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作
    onPostExecute:接收doInBackground的返回结果,用于更新UI

      class AsyncTaskWrapper extends AsyncTask<Void, Integer, Object>{
    
            @Override
            protected Object doInBackground(Void... voids) {
                try {
                    Thread.sleep(2000);
                      } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return null;
            }
    
            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
                Log.e("Progress",valuse);
            }
    
            @Override
            protected void onPostExecute(Object o) {
                super.onPostExecute(o);
                Log.e("Message",o);
            }
        }
    

    相关文章

      网友评论

        本文标题:Android中使用异步线程更新UI视图的几种方法

        本文链接:https://www.haomeiwen.com/subject/pgegrxtx.html