Android 在非主线程无法操作UI意识】的更多相关文章

Android在应用显示Dialog是一个非常easy事儿,但我从来没有尝试过Service里面展示Dialog. 经验UI操作要在主线程,本地的服务Service是主线程里没错,可是远程service里面显示Dialog,听起来是不是就应该没有在主线程里面了呢? 尝试一下就知道了,写了个AIDL的调用,client端去调用AIDL.在Service这边就是去显示一个Dialog. AIDL的部分就忽略了.Service这边的代码就和Activity上显示dialog一样. AlertDialo…
在非主线程中调用了showMessage方法,结果报错:Can't create handler inside thread that has not called Looper.prepare() private void showMessage(String msg) {          Toast toast = Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT);          toast.setGrav…
一.问题描述 -(void)sendAsynchronousRequest { NSLog(@"%@",[NSThread currentThread]); [SVProgressHUD showWithStatus:@"正在登录....." maskType:SVProgressHUDMaskTypeBlack]; NSString *urlString = [NSString stringWithFormat:@"http://120.25.226.1…
引用自:https://www.jianshu.com/p/a8fa72e708d3 引出: 使用Handler的时候,其必须要跟一个Looper绑定.在UI线程可直接初始化Handler来使用.但是在非主线程中直接new Handler() 会报错: E/AndroidRuntime( 6173): Uncaught handler: thread Thread-8 exiting due to uncaught exception E/AndroidRuntime( 6173): java.…
在4.0下面,在主线程中訪问网络,假设请求超过6s的话,就会报ANR,那么这就会带来一个问题,假设网络慢或者请求的数据过大时,界面会卡顿,造成界面灵敏性非常差,因此网络请求一般不能放在主线程中操作,google在4.0时做了调整,一般在主线程中请求网络,就会报错,这样就使得我们这些程序猿就不得不启动子线程去网络网络了,假设4.0在主线程中操作网络报错信息例如以下: <span style="color:#ff6666;">10-19 12:14:44.656: E/Andr…
很多人都对Handler的机制有所了解,如果不是很熟悉的可以看看我 如果看过源码的人都知道,在处理消息的时候使用了Looper.loop()方法,并且在该方法中进入了一个死循环,同时Looper.loop()方法是在主线程中调用的,那么为什么没有造成阻塞呢? 首先我们需要从Android程序启动的入口开始来看:  如果不清楚Android的应用启动详细流程的可以看看这个 然后再看看Looper.loop()方法: public static final void loop() { Looper…
为什么要在非主线程创建NSTimer 将 timer 添加到主线程的Runloop里面本身会增加线程负荷 如果主线程因为某些原因阻塞卡顿了,timer 定时任务触发的时间精度肯定也会受到影响 有些定时任务不是UI相关的,本来就没必要在主线程执行,给主线程增加不必要的负担.当然也可以在定时任务执行时,手动将任务指派到非主线程上,但这也是有额外开销的. NSTimer的重要特性 NSTimer上的定时任务是在创建NSTimer的线程上执行的.NSTimer的销毁和创建必须在同一个线程上操作 NSTi…
Handler传递消息的方式可以实现实时刷新以及长按连续响应事件. 按钮响应 btnadd_fcl.setOnTouchListener(new View.OnTouchListener() { private boolean longclick=false; @Override public boolean onTouch(final View v, MotionEvent event) { // TODO Auto-generated method stub if(event.getActi…
( 转载请务必标明出处:http://www.cnblogs.com/linguanh/, 本文出自:[林冠宏(指尖下的幽灵)的博客]) 前序 本文将会把一下三个问题阐述清楚以及一个网上的普遍观点的补充: 1,安卓 APP 启动过程,对于Activity 的 onCreate 等生命周期的函数为什么不会因为 Looper.loop()里的死循环卡死而永无机会执行. 2,在 1 的基础上,View 的绘制到底是怎样完成的,它又为什么不会因为 Looper.loop()里的死循环卡死而永无机会刷新.…
( 转载请务必标明出处:http://www.cnblogs.com/linguanh/, 本文出自:[林冠宏(指尖下的幽灵)的博客]) 前序 本文将会把一下三个问题阐述清楚以及一个网上的普遍观点的补充: 1,安卓 APP 启动过程,对于Activity 的 onCreate 等生命周期的函数为什么不会因为 Looper.loop()里的死循环卡死而永无机会执行. 2,在 1 的基础上,View 的绘制到底是怎样完成的,它又为什么不会因为 Looper.loop()里的死循环卡死而永无机会刷新.…
和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发送数据,这个用的地方也是非常的多,例如当我们为了优化用户体验,我们会在不影响用户使用的情况下进行后台数据更新,好了废话不多说,开始我们今天的讨论. public class ThreadActivity extends Activity implements OnClickListener{ pri…
由于httpclient在Android5.0以后已经过时,所以官方推荐使用httpUrlConnection来连接网络,现将该连接的基本方法展示,如下 注意:记得加入<uses-permission android:name="android.permission.INTERNET" /> 另外,本例用到了handle来处理消息,跟新UI在主线程中,访问网络在子线程中 客户端代码: package imqsl.com.testhttp; import android.os…
有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话将会存在这种问题: 主线程启动全部子线程并发运行后主线程就直接返回了,导致外部函数判读整个大的事情完毕了,可是实际上并没有完毕! 针对以上情况我想我会採用多线程方式运行同一时候解决主线程等待子线程的问题.如图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ…
背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. 下面说下有关Handler相关的知识. 多线程一些基础知识回顾:在介绍Handler类相关知识之前,我们先看看在Java中是如何创建多线程的方法有两种:通过继承Thread类,重写Run方法来实现通过继承接口Runnable实现多线程 具体两者的区别与实现,看看这篇文章中的介绍:http://de…
从最初开始学习 iOS 的时候,我们就被告知 UI 操作一定要放在主线程进行.这是因为 UIKit 的方法不是线程安全的,保证线程安全需要极大的开销.那么问题来了,在主线程中进行 UI 操作一定是安全的么? 显然,答案是否定的! 在苹果的 MapKit 框架中,有一个叫做 addOverlay 的方法,它在底层实现的时候,不仅仅要求代码执行在主线程上,还要求执行在 GCD 的主队列上.这是一个极罕见的问题,但已经有人在使用 ReactiveCocoa 时踩到了坑,并提交了 issue. 苹果的…
必须在主线程执行的任务: (1)UI更新 必须在非主线程中执行的任务 (1)Http请求 如执行:ImageHelper.getInstance().loadImageSync(picUrl); 外面必须包层线程…
”只能在UI主线程中更新View“. 这句话很熟悉吧? 来来,哥们,看一下下面的例子 @Override       protected void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           setContentView(R.layout.activity_main);           tv = (TextView) findViewById(R.i…
谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是: 主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭, 所以这种耗时的操作不能放在主线程里.放在子线程里,而子线程里是不能对主线程的UI进行改变的, 因此就引出了Handler,主线程里定义Handler,子线程里使用. 消息机制的写法 [1] anr Application not response 应用无响应 主线程(UI线程) [2] 如果在主线程中进行了耗时的操作 (比如连接网络 拷贝大的数据) Th…
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 转载请标明出处:http://blog.csdn.net/seu_calvin/article/details/52120389 方法1  Activity.runOnUiThread 方法如下: runOnUiThread(new Runnable() { @Override public void run() {…
如果不使用HAXM,恐怕网页源码查看器无法获取servlet的源码.初步猜测是安卓模拟器运行速度太慢了.如果CPU不支持VT-x的话,HAXM是安装不上的.所以可以先开启VT-x. 可以参考几篇文章https://jingyan.baidu.com/article/ed15cb1b7586011be2698140.html  http://www.cnblogs.com/lijc1990/archive/2013/02/07/2908969.html来解决安卓模拟器慢的问题. 安装intel的虚…
在一些技术交流群里面,一些初学者(我表示我也是其中一人),总是会发现,为什么我UIView的animate方法,不会动!而是直接闪? 这是为什么呢? 一定要在主线程中更新UI! 一定要在主线程中更新UI! 一定要在主线程中更新UI! 但是平时我们在函数里面直接写的时候,我们是不知道,这个动画方法,到底是在哪个线程执行的. 所以如果遇到了这种情况,最好下断点观察一下,程序执行方法的线程是否是主线程,把更新UI的代码,写在异步或者同步的主线程中更新,就可以解决这种情况. 至少目前我是遇到了这种情况,…
Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行的功能交由Handler类来处理.这样就解决了线程出现的问题. 下面测试实例功能为单击图片,图片透明度改变为50,300毫秒后恢复不透明,代码如下: public class Demo extends Activity{ private ImageView changeImg = null;//Im…
MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.widget.TextView; /** * Demo描述: * * 示例步骤如下: * 1 子线程给子线程本身发送消息 * 2 收到1的消…
Android在4.0之后执行线程更新UI操作会报异常:CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.那么你肯定能看到很多文章说android里子线程不能刷新UI.这句话不能说错,只是有些不太严谨.其实线程能否刷新UI的关键在于ViewRoot是否属于该线程. 首先,CalledFromWrongThreadException这个异…
问题描写叙述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是仅仅能在主线程中更改 ui.子线程要改动 ui 仅仅能 post 到主线程或者使用 handler 之类.可是细致看看exception的描写叙述并非这种."Only the original thread that created a view hierarchy can touch its views".仅仅有创建该 v…
引子: 正如我们所知,在android中如果主线程中进行耗时操作会引发ANR(Application Not Responding)异常. 造成ANR的原因一般有两种: 当前的事件没有机会得到处理(即主线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了) 当前的事件正在处理,但没有及时完成 为了避免ANR异常,android使用了Handler消息处理机制.让耗时操作在子线程运行. 因此产生了一个问题,主线程中的Looper.loop()一直无限循环检测消息队列中是否有新消…
记得当时往wcf迁移了部分service以后,tester发现有时候系统会没有任何反应,cpu占用倒是没有问题,可就是做不了事情. 感觉是哪里死锁了,但也不是每次都能再现,后来发现如果把callback关了,这个问题就不出现了,那就可以确定是callback的问题. 再深入调查,就发现原来callback是在client的主线程被调用,即使wcf在非主线程发出请求,如果有callback的话,都会导致这个结果,这是和某个属性联系的,默认就是用主线程调用,当时觉得很不合逻辑啊,因为这样是很容易引起…
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前看一下Android中消息机制: 引用 Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理. Handler:处理者,负责Message的发送及处理.使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新U…
一个Android 程序默认情况只有一个进程,但是一个进程可以有多个线程.其中有一个UI 线程也称为UI主线程,UI Thread在Android程序运行的时候就被创建,主要是负责控制UI界面的显示.更新和控件交互.所有的Android应用程序组件----包括Activity.Service.Broadcast Receiver都在应用程序的主线程中运行.因此,任何组件中的费时操作处理都可能阻塞所有其他的组件.包括Service和可见的Activity. 在Android 中,对未响应的定义是:…
MONO 调用一个线程操作UI 然后报Only the original thread that created a view hierarchy can touch its views.错误 google了一下说UI的操作还是需要到主线程,看了些java的例子 java中是使用了Handler 但是在MONO中需要怎么实现? 一. RunOnUiThread(()=>执行语句  ); demo: this.RunOnUiThread(() => tv.Text = "records…