Android开发UI之在子线程中更新UI】的更多相关文章

转自第一行代码-Android Android是不允许在子线程中进行UI操作的.在子线程中去执行耗时操作,然后根据任务的执行结果来更新相应的UI控件,需要用到Android提供的异步消息处理机制. 代码如下: public class MainActivity extends Activity implements OnClickListener { private static final int UPDATE_TEXT=1; private TextView textView; privat…
问题描写叙述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是仅仅能在主线程中更改 ui.子线程要改动 ui 仅仅能 post 到主线程或者使用 handler 之类.可是细致看看exception的描写叙述并非这种."Only the original thread that created a view hierarchy can touch its views".仅仅有创建该 v…
MainActivity如下: package cc.testui2; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.app.Activity; /** * Demo描述: * 在子线程中更改UI的方式二…
MainActivity如下: package cc.testui1; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.app.Activity; /*…
提起View.post(),相信不少童鞋一点都不陌生,它用得最多的有两个功能,使用简便而且实用: 1)在子线程中更新UI.从子线程中切换到主线程更新UI,不需要额外new一个Handler实例来实现. 2)获取View的宽高等属性值.在Activity的onCreate().onStart().onResume()等方法中调用View.getWidth()等方法时会返回0,而通过post方法却可以解决这个问题. 本文将由从源码角度分析其原理,由于篇幅原因会分(上).(下)两篇来进行讲解,本篇将分…
Android规定仅仅能在主线程中更新UI.假设在子线程中更新UI 的话会提演示样例如以下错误:Only the original thread that created a view hierachy can touch its view((仅仅有原来的线程创建一个视图层次能够触摸它的视图). 仅仅能在主线程中更新UI的原因是:android中相关的view和控件不是线程安全的,我们必须单独做处理. 有的时候须要再子线程中实现更新UI,以下介绍使用Handler实现线程通信的特点实如今子线程中…
一:报错情况 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8798) at android.view.ViewRootImpl.requestLayout(V…
本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值.分享给大家供大家参考之用.具体分析如下: 一般在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从子线程直接修改控件属性时会出现“从不是创建控件的线程访问它”的异常提示. 跨线程更新UI控件的常用方法有两种: 1.使用控件自身的invoke/BeginInvoke方法 2.使用SynchronizationContext的Post/Send方法更新 具体实…
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //完成主界面更新,拿到数据 S…
方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { : //完成主界面更新,拿到数据 String data = (String)msg.obj; updateWeather(); textView.setText(data);…
今天在做练习时,在一个新开启的线程中调用“Toast.makeText(MainActivity.this, "登陆成功",Toast.LENGTH_SHORT).show();” 报错为:Can't create handler inside thread that has not called Looper.prepare() 在新线程中添加Looper.prepare();和Looper.loop();即可. 示例代码段:(该代码在新开的线程中) Looper.prepare()…
第一种: new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { // 在这里运行你要想的操作 比方直接在这里更新ui或者调用回调在 在回调中更新ui } }); context是你传过来的context对象 另外一种: // 假设当前线程是UI线程,那么行动是马上运行.假设当前线程不是UI线程,操作是公布到事件队列的UI线程 // 由于runOnUiThread是Activ…
今天在写程序的时候,使用Xcode 运行工程时报出下面的错误错信息,我还以为是什么呢,好久没遇到过这样的错误了. **ProjectName[1512:778965] This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption an…
①使用Activity中的runOnUiThread(Runnable) ②使用Handler中的post(Runnable) 在创建Handler对象时,必须先通过Context的getMainLooper()获取到主循环器(main looper) 例:new Handler(getMainLooper()).post(action) ③使用Handler中的sendMessage(Message) 例: 1.先创建Handler对象 private Handler handler = ne…
代码1: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Text;using System.Windows.Forms;using Gac; namespace Demo{ public partial class Form1 : Form { public F…
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…
MainActivity如下: package cn.testlooper; import android.app.Activity; import android.os.Bundle; import android.os.Looper; import android.widget.TextView; import android.widget.Toast; /** * Demo描述: * 在子线程中Looper的使用 * * 测试结果: * 可在子线程中更改UI * * 原理备注: * 在Vi…
不管是android ,还是 ios ,请不要在子线程中操作UI,有时有些崩溃,从报错上看不出什么原因,就有可能是子线程操作了UI:切记,切记! 请放在主线程例: activity.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(mContext,"未能正常打开蓝牙设备,请退出重进",Toast.LENGTH_LONG).show(); } });…
当在非UI线程中更新UI(程序界面)时会出现例如以下图所看到的的异常: 那怎样才干在非UI线程中更细UI呢? 方法有非常多种.在这里主要介绍三种: 第一种:调用主线程mHandler的post(Runnable r)方法. 该方法中的Runnable对象会被会加入到mHandler所在线程的Message消息队列中,假设mHandler在主线程中则Runnable 对象中的run方法将会在主线程中运行.所以能够达到更新UI线程的目的. 提示: Handler另一个与之类似的方法postDelay…
开发Android这么久了,总会听到有人说:主线程不能访问网络,子线程不能更新UI.Android的主线程的确不能长时间阻塞,但是子线程为什么不能更新UI呢?今天把这些东西整理,顺便在子线程更新UI. 首先写了一个handler在子线程更新主线程UI,在子线程做了一个耗时操作:从网络下载了一个图片并利用handler发送到handleMessage()的回调中,并更新到主线程的bitmap.图片显示成功,没有问题.接下来在子线程中更新onCreate()中实例化的textview,报错: and…
一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线程中运行,而所有与主UI线程有关的控件数据刷新应该到主UI线程中处理.也就是数据处理线程发消息,让界面UI去更新控件.在MFC中线程分为界面线程和工作者线程,界面实际就是一个线程画出来的东西,这个线程维护一个“消息队列”,“消息队列”也是界面线程和工作者线程的最大区别,这个词应该进到你的脑子里,根深…
本文主要介绍Android的Handler的用法.Handler能够发送Messsage和Runnable对象到与其相关联的线程的消息队列. 每一个Handler对象与创建它的线程相关联.而且每一个Handler对象仅仅能与一个线程相关联. Handler一般有两种用途:1)运行计划任务,你能够再预定的实现运行某些任务.能够模拟定时器.2)线程间通信.在Android的应用启动时.会创建一个主线程,主线程会创建一个消息队列来处理各种消息. 当你创建子线程时,你能够再你的子线程中拿到父线程中创建的…
一.为何写作此文   你是不是经常看到很多书籍中说:不能在子线程中操作ui,不然会报错.你是不是也遇到了如下的疑惑(见下面的代码): @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); Threa…
幸好今天是周末,有时间把这个问题记录一下.在多种语言之间切换,发现开发效率降的很低了,开发成本都集中到调式上了,C/C++这些放弃很久了,突然感觉线程这个问题搞的有点烦躁 我这里提到的线程中更新UI,在大数据 大并发,以及CPU时间碎片上,未经过验证,项目紧 你懂的..如果你和我一样急于实现 可以考虑一下 总体是这样 //NetDataHandler 是被非UI主线程调用的 你现在看到到这两个函数是放在UI窗体上的 public void NetDataHandler(string jsonDa…
转:http://blog.sina.com.cn/s/blog_3fe961ae0100mvc5.html 在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示.但是,在主线线程之外的线程中直接更新页面显示的问题是:系统会报这个异常: ERROR/AndroidRuntime(1222): android.view.ViewRoot$CalledFromWrongThreadException: Only the original…
这是一条规律,很多coder知道,但原因是什么呢? 如下: When a process is created for your application, its main thread is dedicated to running a message queue that takes care of managing the top-level application objects (activities, broadcast receivers, etc) and any windows…
1.使用Thread+Handler实现非UI线程更新UI界面 在UI Thread中创建Handler.用sendMessage(message)或者obtainMessage(result, obj).sendToTarget()在handleMessage方法中更新UI. 推荐使用obtainMessage(result, obj).sendToTarget().由于这种方法会先去消息池中看看有没有Message,假设有.则取出这个Message,假设没有再去创建.这个能够防止Messag…
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前看一下Android中消息机制: 引用 Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理. Handler:处理者,负责Message的发送及处理.使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新U…
今天在学习<第一行Android代码>第9章-子线程进行UI操作时遇到了一些问题. 代码是这样的: ... import java.util.logging.Handler; ... public class MainActivity extends Activity implements View.OnClickListener { public static final int UPDATE_TEXT = 1; private TextView text; private Button c…
1. Android进程 一个应用程序被启动时,系统默认创建执行一个叫做"main"的线程.这个线程也是你的应用与界面工具包(android.widget和android.view包中的组件)交互的地方.于是main线程也被称为界面线程. 这种单线程的模式会带来低性能,除非你能正确的优化你的程序. 打个比方:用户触摸屏幕上的一个按钮时的点击事件即向线程中派发事件,比如每一个事件为一辆车.而每一条线程都好像是一条单行线的单车道.这条车道上的车量都排成队行驶至收费口进行事件处理.当处理的事…