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

第一种:

new Handler(context.getMainLooper()).post(new Runnable() {

	@Override
	public void run() {
		// 在这里运行你要想的操作 比方直接在这里更新ui或者调用回调在 在回调中更新ui

	}
});

context是你传过来的context对象

另外一种:

// 假设当前线程是UI线程,那么行动是马上运行。假设当前线程不是UI线程,操作是公布到事件队列的UI线程
// 由于runOnUiThread是Activity中的方法,Context是它的父类,所以要转换成Activity对象才干使用
((Activity) context).runOnUiThread(new Runnable() {

	@Override
	public void run() {
		// 在这里运行你要想的操作 比方直接在这里更新ui或者调用回调在 在回调中更新ui
	}
});

第三种:

第三种是使用Handler的方法,往Handler中发送一个消息,然后当Handler接收到你发送过来的消息,再在Handler运行对应的操作

这是接收消息运行的代码:

	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);

			switch (msg.what) {
			case 1:
				button1.setText("点击安装");
				down = 1;
				break;
			case 2:
				down = 2;
				button1.setText("打开");
				break;
			}
		}

	};

这是发送消息的代码:

// 往handler发送一条消息 更改button的text属性
Message message = handler.obtainMessage();
message.what = 1;
handler.sendMessage(message);
时间: 2024-10-12 14:55:57

Android 在子线程中更新UI的几种方法的相关文章

老问题:Android子线程中更新UI的3种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //完成主界面更新,拿到数据 S

android 不能在子线程中更新ui的讨论和分析

问题描述 做过android开发基本都遇见过ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改ui,子线程要修改ui只能post到主线程或者使用handler之类.但是仔细看看exception的描述并不是这样的,"Only the original thread that created a view hierarchy can touch its views",只有创建该 view 布局层次的原始线程

使用Handler在子线程中更新UI

Android规定只能在主线程中更新UI,如果在子线程中更新UI 的话会提示如下错误:Only the original thread that created a view hierachy can touch its view((只有原来的线程创建一个视图层次可以触摸它的视图). 只能在主线程中更新UI的原因是:android中相关的view和控件不是线程安全的,我们必须单独做处理. 有的时候需要再子线程中实现更新UI,下面介绍使用Handler实现线程通信的特点实现在子线程中更新UI. H

网络操作不能直接写在主线程中 以及 为什么不能在子线程中更新UI控件的属性

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //注意: 所有网络操作不能直接写在主线程中 因为所有的网络操作都是耗时的,如果加载到主线程中,会导致与用户的交互出现问题 ,所以要加载到子线程中 // [self loadImage]; [self performSelectorInBackground:@selector(loadImage) withObject:nil]; } //加

Android开发之在子线程中更新UI

转自第一行代码-Android Android是不允许在子线程中进行UI操作的.在子线程中去执行耗时操作,然后根据任务的执行结果来更新相应的UI控件,需要用到Android提供的异步消息处理机制. 代码如下: 1 public class MainActivity extends Activity implements OnClickListener { 2 private static final int UPDATE_TEXT=1; 3 private TextView textView;

android子线程中更新UI的方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 参考:Android子线程 方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //

android 在子线程中操作UI 导致Fragment显示空白问题

需求是这样的 当没网络的请求下就显示缓存中的数据,这样做是为了在没网的情况下 不至于界面什么都没有,给用户的体验效果不好,所以就加了个缓存机制,但是这个缓存的代码是我从上家公司拷贝过来的,没怎么仔细看,当在没网的情况下,出现切换tab页,fragment显示空白问题,连标题栏都显示不出来,   后来我就把缓存的那个 注释了  问题就好了,于是问题定位就是缓存这块了,找到问题就相当于问题解决了一半,然后发现那个回调是在子线程中的,而我在这个回调中操作了UI, 所以才会导致界面空白  在此记录下 版

在子线程中更新UI,只能使用Handler

package com.pingyijinren.test; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; pu

为什么我们可以在非UI线程中更新UI

尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 看到这样的标题--估计N多人会说我是逗比----因为很多盆友在学习Android(特别是从4.0之后开始入门的)的时候都会常看见或听到别人说我们更新UI呢要在UI线程(或者说主线程)中去更新UI,不要在子线程中更新UI,而Android官方呢也建议我们不要在非UI线程直接更新UI,为什么呢?借助Android官方的一句话来说就是: