`
javaz
  • 浏览: 33386 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

子线程更新UI的三种方式

 
阅读更多

从网上搜到的结果,做为整理,以便自己日后使用。

方法一:用Handler

1、主线程中定义Handler:

 

Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			switch (msg.what) {
			case 0:
				//完成主界面更新,拿到数据
				String data = (String)msg.obj;
				updateWeather();
				textView.setText(data);
				break;
			default:
				break;
			}
		}
	};

  2.子线程发消息,通知Handler完成UI更新:

 

 

private void updateWeather() {
		new Thread(new Runnable(){
			@Override
			public void run() {
				//耗时操作,完成之后发送消息给Handler,完成UI更新;
				mHandler.sendEmptyMessage(0);	
				//需要数据传递,用下面方法;
				Message msg =new Message();
				msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;				mHandler.sendMessage(msg);
			}
			
		}).start();
		
	}

 方法一的Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递content对象或通过接口调用;

 

 

方法二:用runOnUiThread更新

在子线程中通过runOnUiThread()方法更新UI:

 

new Thread() {
			public void run() {
				//这儿是耗时操作,完成之后更新UI;
				runOnUiThread(new Runnable(){
					@Override
					public void run() {
						//更新UI
						imageView.setImageBitmap(bitmap);
					}
				});
			}
		}.start();

   如果在非上下文类中(Activity),可以通过传递上下文实现调用;

 

 

Activity activity = (Activity) imageView.getContext();
				activity.runOnUiThread(new Runnable() {
					@Override
					public void run() {
						imageView.setImageBitmap(bitmap);
					}
				});

  这种方法使用比较灵活,但如果Thread定义在其他地方,需要传递Activity对象;

 

 

方法三:View.post(Runnable r)

imageView.post(new Runnable(){
					@Override
					public void run() {
						imageView.setImageBitmap(bitmap);
					}
				});

 这种方法更简单,但需要传递要更新的View过去;

分享到:
评论

相关推荐

    C#子线程更新UI控件的方法实例总结

    这两种方法都是为了确保UI更新操作在主线程上执行,避免了“从不是创建控件的线程访问它”的异常。选择哪种方法取决于你是否需要等待更新完成(Invoke适合同步更新,Post适合异步更新)。 在实际应用中,通常建议...

    安卓UI线程和子线程通讯更新UI实例

    // 获取并处理数据,然后通过上面提到的方式更新UI String responseData = response.body().string(); } }); ``` 在这个实例中,OkHttp的enqueue方法会在后台线程执行网络请求,并在onResponse方法中回调,此时...

    子线程中更新UI线程的三种方法

    总结来说,子线程中更新UI线程主要有Handler+Looper、Runnable+runOnUiThread以及AsyncTask这三种方式。Handler提供了更灵活的消息机制,适合复杂的同步需求;Runnable+runOnUiThread则更为简洁,适合快速实现简单的...

    子线程中更新UI的三种方法和获取message的两种方法总结

    本文将深入探讨在子线程中更新UI的三种有效方法,并同时讲解如何在Android中获取和处理Message,这是异步通信的关键。 1. **Handler-Looper机制** Handler、Looper和Message是Android系统提供的异步通信框架,用于...

    子线程更新主线程数据

    在多线程编程中,"子线程更新主线程数据"是一个常见的需求,尤其是在UI界面交互和后台处理相结合的应用中。主线程通常负责用户界面的显示与交互,而子线程则用于执行耗时的任务,避免阻塞主线程,提供良好的用户体验...

    wpf 子线程更新UI demo

    这个"wpf 子线程更新UI demo"是一个展示如何在后台线程执行任务并安全更新UI的实例。下面将详细介绍这两种方法及其背后的原理。 1. **Dispatcher对象** WPF提供了一个名为`Dispatcher`的对象,它是每个UI线程的...

    c#子线程如何读取及设置主线程ui的值

    c#子线程如何读取及设置主线程ui的值,自己录的一个小视频,方便理解,比较菜鸟的方法,请勿喷!

    Testhandler,Handler子线程更新ui的简单demo

    Handler子线程更新ui的简单demo

    c#子线程操作UI控件的简单委托 包含带参数和不带参数源码

    - `BeginInvoke`:这是一个异步调用,子线程不会阻塞,而是立即返回,UI更新在后台进行。适用于非阻塞式操作,以保持子线程的运行效率。 4. 示例代码 - 不带参数: ```csharp private delegate void ...

    qt编程_在子线程中更新UI界面

    主线程拥有GUI事件循环,子线程可以有自己的事件循环,但通常不处理GUI事件。 3. **QThread的使用**:要创建一个子线程,首先需要继承QThread并重写run()方法,这里放入耗时操作。然后实例化并启动线程。但是,直接...

    QT子线程更新主线程

    "QT子线程更新主线程"这个主题涉及到如何在后台线程(子线程)执行耗时操作,并将结果安全地传递到用户界面线程(主线程),以避免阻塞UI,保持其流畅性。 Qt库提供了QThread类来支持多线程编程。子线程通常用于...

    如何从子线程更新主线程数据

    在多线程编程中,尤其是使用VC++进行开发时,如何有效地从子线程更新主线程的数据是一个重要的问题。这涉及到线程间通信(Thread Communication)的概念,它确保了不同线程之间的协作和数据同步。在Windows环境中,...

    Python+PyQT5的子线程更新UI界面的实例

    #### 三、子线程更新UI的方法 ##### 3.1 使用信号与槽 在PyQT5中,可以通过信号(signal)和槽(slot)机制实现线程之间的通信。具体来说,子线程中可以定义一个信号,当需要更新UI时发出该信号;主线程中监听这个信号,...

    解决PySide+Python子线程更新UI线程的问题

    ### 解决PySide+Python子线程更新UI线程的问题 #### 一、问题背景与重要性 在GUI编程中,界面的响应速度直接影响用户体验。为了保持用户界面(UI)的流畅度,通常会将耗时操作放到后台线程进行处理,避免阻塞UI...

    C#WinForm跨线程更新UI的四种方法

    以上四种方法都可以有效地解决WinForms应用中跨线程更新UI的问题,选择哪种方法主要取决于具体需求,如是否需要等待后台操作完成、是否希望简化编程模型等。在实际开发中,通常推荐使用BackgroundWorker,因为它提供...

    如何从子线程更新主线程数据实例C#.net源代码编写

    现在,让我们看一个简单的示例,演示如何从子线程更新UI。 ```csharp using System; using System.Windows.Forms; // 对于Windows Forms // 或者 using System.Windows; 对于WPF public partial class MainForm : ...

    MFC子线程中更新控件内容的两种办法

    尽管这种方式简单易用,但并不是最佳实践,因为它违反了UI更新应当在主线程中执行的原则。下面是一个简单的示例: 1. **添加成员变量**:在对话框类中添加线程对象的指针和线程函数。 ```cpp CWinThread* m_...

    在MFC 子线程中使用UI(控件)退出时死锁或者超时处理参考

    在MFC(Microsoft Foundation Classes)框架中,子线程与主线程交互并操作用户界面(UI)时,可能会遇到一些特定的问题,特别是当涉及到退出、死锁或超时的情况。以下是对这些知识点的详细说明: 1. **MFC 子线程**...

    Android-dialog库可以在任意类内调用子线程或ui线程内均可显示

    标题提到的“Android-dialog库”是Android开发中的一个第三方库,它提供了一种灵活的方式,使得开发者能够在任意类中方便地调用Dialog,并且支持在子线程或UI线程内显示,这极大地提高了代码的可复用性和执行效率。...

    WPF 使用线程更新UI

    当UI更新频繁或处理大量数据时,如果这些操作都在主线程上进行,就可能导致界面卡顿,用户体验下降。为了解决这个问题,WPF引入了多线程技术,允许开发者在后台线程处理耗时任务,然后通过特定的方式安全地更新UI。 ...

Global site tag (gtag.js) - Google Analytics