首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

应该在UI线程中调用findviewbyid吗?

在Android开发中,UI线程是负责处理用户界面的线程,因此在UI线程中调用findviewbyid是非常正常的。findviewbyid方法用于在布局文件中查找指定ID的视图,并返回该视图的引用。在UI线程中调用findviewbyid可以确保在访问视图时不会出现并发问题,从而避免出现不可预知的错误。

然而,在某些情况下,可能需要在非UI线程中调用findviewbyid。例如,在处理后台任务时,可能需要在后台线程中访问UI元素。在这种情况下,应该使用runOnUiThread方法将访问findviewbyid的代码封装到UI线程中,以确保线程安全。

总之,在大多数情况下,应该在UI线程中调用findviewbyid。如果确实需要在非UI线程中访问UI元素,请使用runOnUiThread方法将访问代码封装到UI线程中。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

线程调用UI线程的方法

vs2005,子线程不允许使用UI的控件,网上的解决方法都有:使用控件的Invoke,不过在我自己的应用总觉得麻烦:我要从子线程调用一个主线程的处理,要用一次委托,而Invoke还要用委托,...我稍微改了一下结构,可以比较方便的达到在子线程调用UI线程的处理函数。...在线程,定义 public delegate void ReceivedHandlerUI(object obj);     //接收处理,涉及UI 使用两个变量,第二个只要是界面的任意控件都行,...ctl) {     OnReceivedUI = rh;     UICtrol = ctl; } 子线程需要调用UI的处理: if (OnReceivedUI !...同时,由于是在UI线程执行,所以操作控件时也不用考虑并发性线程安全之类的。

1.2K80

java:ObservableObserver模式在SWT环境下UI线程UI线程的透明化调用

但是我们知道大部分UI框架(比如SWT)都要区分UI线程和非UI线程,如果Observable对象在非UI线程执行notifyObservers操作,而Observer的update方法又涉及UI对象的操作时就会抛出异常...(参见 《SWT的UI线程和非UI线程》) 如果Observer的代码不用关心自己是不是在UI线程,就可以降低Observer代码的复杂度,所以为解决这个问题,我对Observable做了进一步封装。...线程/非UI线程的透明化调用 * @author guyadong * */ public class SWTObservable extends Observable { /**...(o, arg); } else { // 非UI线程调用 Display.syncExec方法执行 display.syncExec...线程和非UI线程》http://blog.csdn.net/dollyn/article/details/38582743

49610
  • Android NDKUI线程

    概述 在AndroidUI线程是一个很重要的概念。我们对UI的更新和一些系统行为,都必须在UI线程(主线程)中进行调用。...在Linux是没有主线程这一概念的。 那么,如果我们在子线程调用了一个native方法,在C++的代码,我们想要切换到主线程调用某个方法时,该如何切换线程呢?...需求 众所周知,Toast消息,是无法在子线程调用的。如果我们在子线程执行C++的代码,此时想调用toast方法,该如何是好呢?...只是在调用之前,做了线程的转换,在C++层的主线程调用了toast。...目前,我能够想到的是,根据内容,在handle_message实现“解包”。 总结 在native层,想要切到主线程调用方法。其根本是在应用启动时,就在主线程调用初始化,构建好一个消息通道。

    2.5K40

    线程也不绝对安全的 UI 操作

    从最初开始学习 iOS 的时候,我们就被告知 UI 操作一定要放在主线程进行。这是因为 UIKit 的方法不是线程安全的,保证线程安全需要极大的开销。...那么问题来了,在主线程中进行 UI 操作一定是安全的么? 显然,答案是否定的!...GCD 知识复习 在 GCD ,使用dispatch_get_main_queue()函数可以获取主队列。调用dispatch_sync()方法会把任务同步提交到指定的队列。...如果我们在子队列调用MapKit的addOverlay方法,即使当前处于主线程,也会导致 bug 的产生,因为这个方法的底层实现判断的是主队列而非主线程。...更进一步的思考,有时候为了保证 UI 操作在主线程运行,如果有一个函数可以用来创建新的UILabel,为了确保线程安全,代码可能是这样: -(UILabel *)labelWithText:(NSString

    98210

    jdk8 hashmap线程安全_Python线程

    扩容引发的线程不安全 HashMap的线程不安全主要是发生在扩容函数,即根源是在transfer函数,JDK1.7HashMap的transfer函数如下: void transfer(Entry...即如下图中位置所示: 此时线程A:e=3、next=7、e.next=null 当线程A的时间片耗尽后,CPU开始执行线程B,并在线程B成功的完成了数据迁移 重点来了,根据Java...随后线程A获得CPU时间片继续执行newTable[i] = e,将3放入新数组对应的位置,执行完此轮循环后线程A的情况如下: 接着继续执行下一轮循环,此时e=7,从主内存读取e.next时发现主内存...JDK1.8线程不安全 根据上面JDK1.7出现的问题,在JDK1.8已经得到了很好的解决,如果你去阅读1.8的源码会发现找不到transfer函数,因为JDK1.8直接在resize函数完成了数据迁移...除此之前,还有就是代码的第38行处有个++size,我们这样想,还是线程A、B,这两个线程同时进行put操作时,假设当前HashMap的zise大小为10,当线程A执行到第38行代码时,从主内存获得size

    76521

    如何在多线程调用winform窗体控件

    由于 Windows 窗体控件本质上不是线程安全的。因此如果有两个或多个线程适度操作某一控件的状态(set value),则可能会迫使该控件进入一种不一致的状态。...还可能出现其他与线程相关的 bug,包括争用和死锁的情况。...于是在调试器运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException  本文用一个很简单的示例来讲解这个问题(在窗体上放一个...TextBox和一个Button,点击Button后,在新建的线程设置TextBox的值) 解决办法一: 关闭该异常检测的方式来避免异常的出现 经过测试发现此种方法虽然避免了异常的抛出,但是并不能保证程序运行结果的正确性...              {                 _TextBox.Text = _Value;             }         }     } } 解决办法二:通过委托安全调用

    2.2K100

    你真的了解Java线程

    获取待执行任务 由上文的任务分配部分可知,任务的执行有两种可能: 一种是任务直接由新创建的线程执行。 另一种是线程从任务队列获取任务然后执行,执行完任务的空闲线程会再次去从队列申请任务再去执行。...第一种情况仅出现在线程初始创建的时候,第二种是线程获取任务绝大多数的情况。线程需要从任务缓存模块不断地取任务执行,帮助线程从阻塞队列获取任务,实现线程管理模块和任务管理模块之间的通信。...4、CallerRunsPolicy:使用此策略,如果添加到线程池失败,那么调用线程(提交任务的线程)会自己去执行该任务,不会等待线程池中的线程去执行。...thread是在调用构造方法时通过ThreadFactory来创建的线程,可以用来执行任务; firstTask用它来保存传入的第一个任务,这个任务可以有也可以为null。...线程池在执行shutdown方法或tryTerminate方法时会调用interruptIdleWorkers方法来中断空闲的线程,interruptIdleWorkers方法会使用tryLock方法来判断线程池中的线程是否是空闲状态

    27020

    c#线程同步Lock(锁)的研究以及跨线程UI的操作

    本文只针对C#,多线程同步所用到的锁(lock)作为研究对象。由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧。...其实多线程的同步,使用同步锁的方法用了好多次,今天无意中看到MSDN,建议用: private static readonly object locker1 = new object(); private...然后我写了一段代码进行测试,测试类代码如下: // /// 跨线程操作UI的时候传递的参数,本文为了显示消息,所以简单的封装了一个 /// ...num = 0; ShowMessage(); } } //锁内的一些操作,并通过事件,把关键的消息显示到主线程的...窗体,用于事件回调,显示到UI里的代码在这里: delegate void MessageHandler(string msg); public void MessageCallBack

    1.8K20

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

    本文介绍了Android 在子线程更新UI的几种方法示例,分享给大家,具体如下: 方式一:Handler和Message ① 实例化一个Handler并重写handlerMessage()方法 private...Message msg = handler.obtainMessage(); msg.what = 1; handler.sendMessage(msg); 方式二:在子线程中直接调用Activity.runOnUiThread...} }); 方式三:在子线程调用View的post()方法 myView.post(new Runnable() { @Override public void run()...{ // 更新UI myView.setText(“更新UI”); }}); 方式四:在子线程调用View.PostDelayed(Runnabe,long) 对方式三对补充,long...参数用于制定多少时间后运行后台进程 方式五:Handler的post()方法 ① 创建一个Handler成员变量 private Handler handler = new Handler(); ② 在子线程调动

    5.5K31

    线程的join()方法,你真的了解

    为什么会突然想到这么一个方法,好像大家工作不怎么常用,但是在平时的面试只要涉及到多线程,大多情况下都会问到这个方法,我们也只是简单的看看面试题说个大概,但是真正的用法大家可能跟我之前一样是比较模糊的...} 没错,执行结果确实是大部分人猜测的那样,先是主线程执行,然后线程B执行,最后是线程A。...2、join()方法 大白话:就是谁调用这个方法,就让调用此方法的线程进入阻塞状态,等待我执行完毕之后,再往下执行; 那么我们再来看上面那段加了join()的代码,首先开启线程A,紧接着线程A调用了join...()方法进入阻塞状态,那么线程必须等待线程A执行结束之后再往下执行,线程A执行完毕,线程B开启,进入睡眠,主线程执行,线程B睡眠结束,执行; 3、真实场景需求 我上周在做一个爬虫项目,大概是这样的,我要开启多条线程同时爬取不同网站的信息...,紧接着t1调用了join()方法,那么就必须等待t1执行完毕之后再执行t2,所以此时的多线程代码,其实已经变成了单线程,我们来看下两段代码的执行结果。

    52610

    android的AsyncTask的应用

    在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现的原理 在Handler 异步实现时,主要是主线程启动Thread(子线程)并生成Message,传递给Handler.../ */ @Override protected void onPreExecute() { } /* * 这个方法的所有代码都会在子线程运行,我们应该在这里去处理所有的耗时任...* 注意,在这个方法是不可以进行UI 操作的, * 如果需要更新UI元素,可以调用publishProgress(Progress......publishProgress(Progress...)方法后,这个方法就会很快被调用, * 方法携带的参数就是在后台任务传递过来的。...在这个方法可以对UI 进行操作, * 利用参数的数值就可以对界面元素进行相应地更新。

    42930

    面试:Spring 的bean 是线程安全的

    SpringBean作用域的理解,先说结论,Spring的Bean不是线程安全的。...Spring容器的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。...如果单例Bean,是一个无状态Bean,也就是线程的操作不会对Bean的成员执行「查询」以外的操作,那么这个单例Bean是线程安全的。...有状态就是有数据存储功能 无状态就是不会保存数据 controller、service和dao层本身并不是线程安全的,只是如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存复制变量,这是自己的线程的工作内存...《Java并发编程实战》第3.2.2节: 局部变量的固有属性之一就是封闭在执行线程。 它们位于执行线程的栈,其他线程无法访问这个栈。 所以其实任何无状态单例都是线程安全的。

    11K95

    iOS的atomic一定是线程安全

    引言 在iOS开发,我们常常会用到@property来声明属性,在声明属性的关键字中有一对atomic和nonatomic关键字。...[_name release]; _name = [name copy]; } OSSpinLockUnlock(&oslock); } 那使用atomic就能保证线程安全...不能 线程安全是指多个线程在并发执行时同时访问操作同一块内存造成数据错误或冲突,引起执行结果的不确定。...使用了atomic后只是保证了在使用这个属性的getter和setter时的线程安全,并不能保证整个对象是线程安全的。...比如一个线程循环的读数据,另一个线程循环的写数据,必然会有线程安全的问题;如果一个线程正在getter或者setter,又有另一个线程同时进行了release操作,则会发生crash 总结 atomic

    1.4K60

    Android 进程和线程模型

    所以主线程通常又被叫做UI线程。 在开发Android 应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程执行。...如果在新开的线程需要对UI进行设定,就可能违反单线程模型,因此android采用一种复杂的Message Queue机制保证线程间通信 Message Queue: Message Queue是一个消息队列...你可以在自己的子线程创建Handler与UI thread通讯。 通过Handler你可以发布或者处理一个消息或者是一个Runnable的实例。...,在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。...使用时需要遵循以下规则: 1)Task的实例必须在UI thread创建 2)execute方法必须在UI thread调用 3)不要手动的调用这些方法,只调用execute即可 4)该task只能被执行一次

    1.5K20

    Android开发笔记(四十七)Runnable接口实现多线程

    如果在Handler或者View启动Runnable,那么Runnable事务便运行于UI线程;如果在Thread启动Runnable,那么Runnable事务便运行于非UI线程。...该功能的例子见《Android开发笔记(四十六)手机相关事件》 视图刷新的post方法 下列方法用于刷新View自身视图: invalidate : 在UI线程刷新视图 postInvalidate...: 在非UI线程刷新视图 postInvalidateDelayed : 在非UI线程延迟若干时间后刷新视图 为避免误解,这里对invalidate和postInvalidate的区别做进一步的说明...: 1、invalidate只能在UI线程调用,所以如果在Thread方式调用invalidate就会抛出异常;postInvalidate可在Thread方式调用,但并不是不能在UI线程调用...,实际上postInvalidate既可在UI线程调用,也可在非UI线程调用; 2、invalidate只能立即刷新视图,而post方式还有postInvalidateDelayed方法可以延迟一段时间

    2.2K30
    领券