Android 在子线程中更新UI的几种方法示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 在子线程中更新UI的几种方法示例相关的知识,希望对你有一定的参考价值。

参考技术A

请您慢慢看:

直接在UI线程中开启子线程来更新TextView显示的内容,运行程序我们会发现,如下错误:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.翻译过来就是:只有创建这个控件的线程才能去更新该控件的内容。

所有的UI线程要去负责View的创建并且维护它,例如更新冒个TextView的显示,都必须在主线程中去做,我们不能直接在UI线程中去创建子线程,要利用消息机制:handler,如下就是handler的简单工作原理图:

既然android给我们提供了Handler机制来解决这样的问题,请看如下代码:

public class HandlerTestActivity extends Activity private TextView tv; private static final int UPDATE = 0; private Handler handler = new Handler() @Overridepublic void handleMessage(Message msg) // TODO 接收消息并且去更新UI线程上的控件内容if (msg.what == UPDATE) // Bundle b = msg.getData();// tv.setText(b.getString("num")); tv.setText(String.valueOf(msg.obj)); super.handleMessage(msg); ; /** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.tv); new Thread() @Overridepublic void run() // TODO 子线程中通过handler发送消息给handler接收,由handler去更新TextView的值try for (int i = 0; i < 100; i++) Thread.sleep(500); Message msg = new Message(); msg.what = UPDATE; // Bundle b = new Bundle();// b.putString("num", "更新后的值:" + i);// msg.setData(b); msg.obj = "更新后的值:" + i; handler.sendMessage(msg); catch (InterruptedException e) e.printStackTrace(); .start();

我们就通过Handler机制来处理了子线程去更新UI线程控件问题,Andrid开发中要经常用到这种机制。

ios开发在子线程更新ui会怎样

参考技术A 会闪退 iOS 不允许子线程更新 UI 参考技术B 可能会出现闪退,也可能会引发动画异常,比如整体的动画效果全部消失 包括pop push

以上是关于Android 在子线程中更新UI的几种方法示例的主要内容,如果未能解决你的问题,请参考以下文章

在多线程中,子线程更新主线程ui都有哪些方法及注意点

ios开发在子线程更新ui会怎样

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

为啥loop之后就可以子线程更新ui

Android 子线程更新UI那些事儿

Android编程:如何在子线程中更新TextView控件