`

handler处理非ui线程中更新view异常

 
阅读更多

用一个新的线程更新listView的内容,出现如下异常

08-07 22:13:13.336: ERROR/AndroidRuntime(10753): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

 

 一个android程序默认只有一个process,一个process可以有多个Thread,在这些Thread中一个Thread叫做UI Thread,负责UI界面的显示、更新和控件交互。而其他的线程无法直接操作控件和使用控件相关的api,那么如果想在一个新的Thread中的更新控件,该如何操作呢,莫及@_*,在Android程序中我们可以使用Handler来操作,Handler用来处理和操作一个消息队列中的消息,所以我们可以通过向这个消息队列中发送消息来更新UI

 

1、handler定义

    class EHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SnsConstant.LOAD_MORE_STATUS_WHAT:
                    setListAdapter();
                    break;
            }
        }
    };

 其中switch部分为处理消息部分,setListAdapter为对ui进行操作

 

2、对象声明

private EHandler         handler= new EHandler();
 

3、发送消息

handler.sendEmptyMessage(SnsConstant.LOAD_MORE_STATUS_WHAT);

 从中可以看出,所以我们在非ui线程中发送消息,然后在handler中处理消息,ok,搞定~

 

在android开发中我们需要充分利用线程及消息队列来处理需要长时间响应的操作,防止ui假死

 

参考:

http://jinguo.iteye.com/blog/660073

http://developer.android.com/guide/topics/testing/activity_testing.html#UITestTroubleshooting

分享到:
评论

相关推荐

    Android Handler Looper Message 使用示例

    在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...

    Android实现在子线程中更新Activity中UI的方法

    本文实例讲述了Android实现在子线程中更新Activity中UI的方法。分享给大家供大家参考,具体如下: 在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示...

    详解android异步更新UI的几种方法

    我们知道在Android开发中不能在非ui线程中更新ui,但是,有的时候我们需要在代码中执行一些诸如访问网络、查询数据库等耗时操作,为了不阻塞ui线程,我们时常会开启一个新的线程(工作线程)来执行这些耗时操作,...

    android中Invalidate和postInvalidate的更新view区别

    Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。 Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在...

    android使用handler ui线程和子线程通讯更新ui示例

    import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget....

    android开发教程之handler异步更新ui

    调用Handler.post(Runnable r)方法,Runnable运行在UI所在线程,所以可以直接调用View.invalidate() 代码如下:packagecom.Test.androidtest; importandroid.app.Activity;importandroid.content.Context;importandroid...

    android 多线程多任务断点下载

    //对于UI控件的更新只能由主线程(UI线程)负责,如果在非UI线程更新UI控件,更新的结果不会反映在屏幕上,某些控件还会出错 private void download(final String path, final File dir){ new Thread(new Runnable...

    总结Android中多线程更新应用的页面信息的方式

    主要介绍了总结Android中多线程更新应用的页面信息的方式,文中共总结了runOnUiThread、Handler、AsyncTask异步以及View直接在UI线程中更新的方法,需要的朋友可以参考下

    android使用surfaceview+MediaPlayer播放视频

    Android中播放视频主要有两种方式: 使用其自带的播放器。指定Action为ACTION_VIEW,Data为Uri,...这样以来就很方便了,比如在线播放,就不需要自己去写handler来实现两个线程之间的通信了,直接可以在非UI线程中播放

    Android实现listview动态加载数据分页的两种方法

    并使用数据配合更新UI,AsyncTask是在一个线程中执行耗时操作然后把结果传给UI线程,不需要你亲自去管理线程和句柄。 一、使用Handler+线程方法 1、基础知识 Handler在android系统中,主要负责发送和接收消息,它的...

    android主线程和子线程之间消息传递详解

    从主线程发送消息到子线程(准确地说应该是非UI线程) package com.zhuozhuo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os....

    Android消息机制基本原理和使用

    Android老手知道这是怎么回事,并且知道解决方案,新手只能去网上找答案,网上的答案告诉我们报错是因为子线程不能直接更新UI线程,也就是主线程的控件,必须通过Android消息机制来更新。略微遗憾的是,网上的答案...

    子线程和主线程5种交互方式 Demo

    android 中的五中子线程和主线程交互方式,可针对整个activity的UI或者单个View

    android使用Rxjava实现倒计时功能

    我们可以在子线程中直接使用发射器每融1S发出一个时间,在主线程中接收更新ui,在等倒计时结束恢复界面,下面给出在用户注册时获取验证码的,倒计时使用的代码demo。具体调用方法如下: /** * 点击获取验证码,...

    Android开发案例驱动教程 配套代码

    8.4.1 Android线程应用中的问题与分析 164 8.4.2 Message和MessageQueue 169 8.4.3 Handler 169 8.4.4 Looper和HandlerThread 172 本章小结 178 第9章 Activity和Intent 179 9.1 Activity 179 9.1.1 创建...

    android开发秘籍

    3.2 线程之间的消息机制:handler 46 3.2.1 秘诀17:从主线程调度runnable 任务 46 3.2.2 秘诀18:使用倒数计时器 49 3.2.3 秘诀19:处理耗时的初始化工作 50 3.3 服务 51 3.4 添加broadcast receiver 56 3.5 ...

    网络获取json解析json以及子线程显示

    import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.v7.app.... // 将ContentHandler的实例设置到XMLReader中 xmlReader.setContentHandler(handler); ...

    应用启动页自定义跳转计时器View Demo

    应用启动页自定义跳转计时器View Demo: CircleTextProgressbar.java: package com.demo.startpageskiptimerdemo.widget; import android.content.Context; import android.content.res.ColorStateList; import ...

    asp.net知识库

    在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中...

    Android知识点及重要代码合集 word文档

    7.2 UI线程模型的两条规则及矛盾解决的三种方法 61 7.3 方法一代码 62 7.4 AsyncTask 特点、参数及需要实现的方法 64 7.5 异步任务代码 64 7.6 下载进度对话框相关实现代码 67 7.7使用runONUiThread()\...

Global site tag (gtag.js) - Google Analytics