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

本文实例讲述了Android实现在子线程中更新Activity中UI的方法。分享给大家供大家参考,具体如下:

在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示。但是,在主线线程之外的线程中直接更新页面显示的问题是:系统会报这个异常:

ERROR/AndroidRuntime(1222): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

或许编程人员会在线程中调用Toast.makeText()方法,试图在UI中显示某些提示信息,这样也会报如下的错误:

Can't create handler inside thread that has not called Looper.prepare()

解决方法:子线程中无法直接去更新Activity中的UI,一般的作法是子线程向Activity传递消息,然后Activity根据这些消息自己来更新UI。Android中有一个类叫android.os.Handler,就是用来做这件事的。

1. 在需要被线程更新UI的Activity 中声明一个android.os.Handler 类的变量,

private Handler handler;

2. onCreate函数中加入handler的初始化:

@Override
public void onCreate(Bundle savedInstanceState) {
//其他代码……
//……
//……
handler=new Handler(){
public void handleMessage(Message msg){
String message=(String)msg.obj;//obj不一定是String类,可以是别的类,看用户具体的应用
 //根据message中的信息对主线程的UI进行改动
 //……                           }
}
};

另外Activity中需要提供handler的get函数,这样线程才能得到handler,进而传递消息。

public Handler getHandler(){
return this.handler;
}

3.子线程类中需要持有表示上下文的Context类对象,实际应用中这个引用就是指向要更新UI的Activity对象,一般声明为:

private Context ctx;

然后在子线程类构造函数或其它函数中初始化ctx,这一步是为了能够得到Activity对象中的Handler对象。(或者用别的方法也行,只要子线程能得到Activity中的这个handler对象就可以。)

4. 最后一步,在子线程运行到某个地方,需要向Activity传递消息的时候,创建一个android.os.Message 类的对象,将要传送的对象加入message ,通过Handler发布传送给主线程,代码示例如下:

String str_temp="要传给主线程的消息"
Message message = Message.obtain();
message.obj=str_temp;
//通过Handler发布传送消息,handler
handler.sendMessage(message);

记住,这里的handler跟Activity中的handler是同一个对象噢,这样才是把消息送到那个Activity中了。

另外,这种方法不但可以让子线程更新UI,还可以有别的用途。现在我们假设子线程可能抛出某些错误,这个应该是很正常的,那么如何让错误信息能够让用户知道呢?很简单,在catch语句块中,将catch到的错误对象,放入message.obj中,传递给Activity,Activity中用Toast.makeText()方法将错误信息显示出来就可以了。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android线程与消息机制用法总结》、《Android编程之activity操作技巧总结》、《Android调试技巧与常见问题解决方法汇总》、《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, ui
, activity
, 更新
子线程
activity ui线程、android activity线程、android子线程更新ui、android 主线程更新ui、android线程更新ui,以便于您获取更多的相关知识。

时间: 2024-12-04 00:22:28

Android实现在子线程中更新Activity中UI的方法_Android的相关文章

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

本文实例讲述了Android实现在子线程中更新Activity中UI的方法.分享给大家供大家参考,具体如下: 在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示.但是,在主线线程之外的线程中直接更新页面显示的问题是:系统会报这个异常: ERROR/AndroidRuntime(1222): android.view.ViewRoot$CalledFromWrongThreadException: Only the original

Android开发之子线程操作UI的几种方法_Android

 在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 方法1 Activity.runOnUiThread 方法如下: runOnUiThread(new Runnable() { @Override public void run() { tv.setText("Hello"); } }); 这种方法简单易用,如果当前线程是UI线程,那么行动是立即执行.如

Android开发之子线程操作UI的几种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 方法1 Activity.runOnUiThread 方法如下: runOnUiThread(new Runnable() { @Override public void run() { tv.setText("Hello"); } }); 这种方法简单易用,如果当前线程是UI线程,那么行动是立即执行.如果

Android 自定义Dialog类,并在Activity中实现按钮监听事件

实际开发中,经常会用到Dialog,比如退出时候会弹出是否退出,或者还有一些编辑框也会用Dialog实现,效果图如下: 开发中遇到的问题无非在于如果在Activity中监听这个Dialog中实现的按钮,Dialog类如下,在MyDialog这个类中实现了一个LeaveMyDialogListener接口,用来实现onclick的点击事件: package com.Ieasy.Tool; import com.Ieasy.ieasyware.R; import android.app.Dialog

android-Android中在activity中调用service中的某个对象的方法

问题描述 Android中在activity中调用service中的某个对象的方法 Android中在activity中如何调用service中的某个对象的方法!大神求助或者说如何在activity中获取到service中的某个对象! 解决方案 你这个问题问的有些问题啊,activity中获取到service中的某个对象!估计就是调用Service的方法吧,为Service写构造方法,New出Service对象后调用,或者直接写成静态方法直接用类名调用,再或者写接口,怎么调用都可以啊,和工具类调

path-android中关于Activity生命周期的方法只有两个 onCreate,onResume

问题描述 android中关于Activity生命周期的方法只有两个 onCreate,onResume public class BolgDetailActivity extends SuperActivity implements OnClickListener{ @Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.

Android编程实现隐藏状态栏及测试Activity是否活动的方法

本文实例讲述了Android编程实现隐藏状态栏及测试Activity是否活动的方法.分享给大家供大家参考,具体如下: 一. 隐藏状态栏 方法如下:在程序中加入//remove title 的那部分代码即可实现. package cn.edu.pku; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public

android怎样让两个不同的activity拥有BActivity的方法和属性

问题描述 android怎样让两个不同的activity拥有BActivity的方法和属性 A继承于ListActivity, B继承于FragmentActivity, 怎样才能让AB两个Activity都拥有我写的BaseActivity的方法和属性 如果可以直接在AB调用BaseActivity,要怎么做,如果可以最好给个demo 解决方案 把这些公共方法独立出来一个类,然后A,B内部都定义内部类,继承这个公共类. public class B extends D{ private cla

android中在Activity中响应ListView内部按钮的点击事件的两种方法_Android

最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在Adapter中响应? 对于这个问题,我最初给他的解答是,在Adapter中定义一个回调接口,在Activity中实现该接口,从而实现对点击事件的响应. 下班后思考了一下,觉得有两种方式都能比较好的实现:使用接口回调和使用抽象类回调. 正好可以复习一下接口和抽象类的区别,于是写了两个Demo: 1.使用接口回调: Adapter类 package com.ivan.adapter; import