Android通过子线程更新UI的几种方式

简介:

Android通过子线程更新UI的几种方式

一般情况下,UI的更新都少不了Handler,首先我们先了解一下Handler机制:

Handler消息机制
定义

Message
线程间通信的数据单元,可通过message携带需要的数据创建对象:Message.obtain(what)

Handler
Handler是Message的处理器,同时也负责消息的发送和移除工作
发送即时消息:即使发送即时处理
发送延时消息:即时发送,过一会儿处理

MessageQueue:消息队列
用来存放通过Handler发送的消息,它是一个按Message的when排序的优先级队列

Looper:循环器
负责循环取出Message Queue里面的当前需要处理的Message,交给对应的Handler进行处理,处理完后,将Message缓存到消息池中,以备复用

Handler的基本使用
步骤:
①创建Handler成员变量,并重写其handleMessage()
②在分线程创建Message对象
③使用handler对象发送Message
④在handleMessage()中处理消息

消息机制原理

文字描述
从handler中获取一个消息对象,把数据封装到消息对象中,通过handler的send方法把消息push到MessageQueue队列中,looper对象会轮询MessageQueue队列,把消息对象取出。通过dispatchMessage分发给Handler,再回调用Handler实现的handleMessage方法处理消息。

接下来,我们再看在通过子线程更新UI常见的几种方式

子线程更新UI
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button update_handler;
private Button update_ViewPost;
private Button update_handlerPost;
private Button update_handlerPostDelay;
private Button update_RunOnUiThread;
private Button update_AsyncTask;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
}

private void initView() {
    update_handler=findViewById(R.id.button1);
    update_ViewPost=findViewById(R.id.button2);
    update_handlerPost=findViewById(R.id.button3);
    update_handlerPostDelay=findViewById(R.id.button4);
    update_RunOnUiThread=findViewById(R.id.button5);
    update_AsyncTask=findViewById(R.id.button6);
    textView=findViewById(R.id.myword);

    update_handler.setOnClickListener(this);
    update_ViewPost.setOnClickListener(this);
    update_handlerPost.setOnClickListener(this);
    update_handlerPostDelay.setOnClickListener(this);
    update_RunOnUiThread.setOnClickListener(this);
   update_AsyncTask.setOnClickListener(this);

}
@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.button1:
            update_handler();

            break;
        case R.id.button2:
            update_ViewPost();
            break;
        case R.id.button3:
            update_handlerPost();
            break;
        case R.id.button4:
            update_handlerPostDelay();
            break;
        case R.id.button5:
            update_RunOnUiThread();
            break;
        case R.id.button6:
            new updateAsyncTask().execute();
            break;
    }

}
Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if(msg.what==1){
            textView.setText("小慕慕");
        }
    }
};

/*
方法1
*/

private void update_handler(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            Message message=handler.obtainMessage();
            message.what=1;
            handler.sendMessage(message);

        }
    }).start();

}
/*
方法2
 */
private void update_ViewPost(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            textView.post(new Runnable() {
                @Override
                public void run() {
                    textView.setText("小九九");
                }
            });
        }
    }).start();
}
/*
方法3
 */

private void update_handlerPost() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    textView.setText("小酒酒");
                }
            });
        }
    }).start();
}

/*
方法4
*/

private void update_handlerPostDelay(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    textView.setText("九酒");
                }
            },3000);
        }
    }).start();
}

/*
方法5
*/

private void update_RunOnUiThread(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText("慕九");
                }
            });

        }
    }).start();
}

/*
方法6
*/

class  updateAsyncTask extends AsyncTask<String,Integer,String>{

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... strings) {

        publishProgress();
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        textView.setText("结束");
    }
}

}
布局文件

<?xml version="1.0" encoding="utf-8"?>

xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"
>
<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="handler"
    android:textAllCaps="false"
    />

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="View.post()"
    android:textAllCaps="false"
   />

<Button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="handlerPost()"
    android:textAllCaps="false"/>

<Button
    android:id="@+id/button4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    android:layout_gravity="center_horizontal"
    android:text="handlerPostDelay()"
    android:textAllCaps="false"/>
<Button
    android:id="@+id/button5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    android:layout_gravity="center_horizontal"
    android:text="runOnUiThread()"
    android:textAllCaps="false"/>

<Button
    android:id="@+id/button6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    android:layout_gravity="center_horizontal"
    android:text=" update_AsyncTask()"
    android:textAllCaps="false"/>

<TextView
    android:id="@+id/myword"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="慕九酒"/>


运行结果:

总结
其实这六种方式并没有太大的区别,前五种方式都是基于第一种方式的封装,都是采用的Thread+handler模式,第六种封装的更厉害了些,它是Thread+hanler+Threadpool。

参考:https://blog.csdn.net/oheg2010/article/details/93092541

原文地址https://www.cnblogs.com/dearnotes/p/12189643.html

相关文章
|
17天前
|
消息中间件 安全 数据处理
Android为什么不能在子线程更新UI
Android为什么不能在子线程更新UI
23 0
|
6天前
|
编解码 Android开发 UED
安卓UI/UX设计原则:打造引人入胜的用户体验
【4月更文挑战第13天】本文探讨了安卓UI/UX设计的关键原则,包括一致性、简洁性、反馈、清晰性、效率和适应性。一致性要求视觉和行为保持一致,利用系统UI;简洁性减少用户行动,简化导航;反馈需即时且明确;清晰性强调表达清晰,布局有序;效率关注性能优化和任务简化;适应性涉及多设备适配和用户多样性。遵循这些原则,可创建出色应用,提供无缝用户体验。设计应持续迭代,适应技术发展和用户需求。
|
10天前
|
XML 移动开发 Android开发
构建高效安卓应用:采用Jetpack Compose实现动态UI
【4月更文挑战第10天】 在现代移动开发中,用户界面的流畅性和响应性对于应用的成功至关重要。随着技术的不断进步,安卓开发者寻求更加高效和简洁的方式来构建动态且吸引人的UI。本文将深入探讨Jetpack Compose这一革新性技术,它通过声明式编程模型简化了UI构建过程,并提升了性能与跨平台开发的可行性。我们将从基本概念出发,逐步解析如何利用Jetpack Compose来创建具有数据动态绑定能力的安卓应用,同时确保应用的高性能和良好用户体验。
14 0
|
11天前
|
XML Java Android开发
Android之UI基础控件
Android之UI基础控件
|
12天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
1月前
|
XML API Android开发
【Android 从入门到出门】第三章:使用Hilt处理Jetpack Compose UI状态
【Android 从入门到出门】第三章:使用Hilt处理Jetpack Compose UI状态
26 4
|
1月前
|
存储 XML 编译器
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
47 3
|
Android开发
Android studio更新后出现警告:Warning:The `android.dexOptions.incremental` property is deprecated and it has
Android studio更新后出现警告:Warning:The `android.dexOptions.incremental` property is deprecated and it has
|
21天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
1月前
|
设计模式 人工智能 开发工具
安卓应用开发:构建未来移动体验
【2月更文挑战第17天】 随着智能手机的普及和移动互联网技术的不断进步,安卓应用开发已成为一个热门领域。本文将深入探讨安卓平台的应用开发流程、关键技术以及未来发展趋势。通过分析安卓系统的架构、开发工具和框架,本文旨在为开发者提供全面的技术指导,帮助他们构建高效、创新的移动应用,以满足不断变化的市场需求。
18 1

热门文章

最新文章