`
buddie
  • 浏览: 185316 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Activity之间传递Handler问题的变通使用广播来解决问题

阅读更多

在我的开发工作中,遇到了这样一种问题:一个非主Activity中新建了一个线程来下载文件,在文件尚未下载完成之前,切换到主Activity界面,同时finish()掉刚才的非主Activity。这时,下载线程,还是在继续下载文件的。

当文件下载完成后,发去一个Message,由非主Activity中的handler来处理。这时因为界面在主Activity界面,怎么才能调用主Activity中的方法来更新主Activity界面呢?

开始我想到了在Activity之间传递Handler,将主Activity中的Handler传递给非主Activity,并在非主Activity中给主Activity中的Handler发送一个Message,在主Activity中处理。

怀着这个想法,我就开始找资料,结果发现Activity之间是无法传递Handler了的。怎么办呢?后来看到某位同仁也遇到了和我一样的问题,在回复中,我发现有人指点说可以用广播。由于,我就试着用广播来解决这个问题。结果,真的实现了我的功能。

下面我大体上介绍一个我的实现方法:

在非主Activity中点击下载按钮时,新建一个线程来下载文件。同时要在非主Activity中定义一个Handler来刷新下载进度。如果界面切到了主Activity界面,当文件下载完成后,非主Activity中的Handler仍会获得信息并处理。我选择在这时发送一个广播:

 

Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
            	int index= msg.getData().getInt("index");
        		if(index!=0){
        			//显示进度
        		}
        		if(index>=100){
                	if(当前是非主Activity){
                		//隐藏进度,弹出下载完成提示
                	}else{
						//给主Activity发送一个广播
                		Intent intent = new Intent("android.intent.action.MAIN");
	    				sendBroadcast(intent);
					}
        		}
            }
        }
};

 

 同时,在主Activity中定义一个广播接收器,并处理

BroadcastReceiver mReceiver=new BroadcastReceiver(){
	public void onReceive(Context context, Intent intent) {
		//刷新主Activity界面
		init();
	}
};
IntentFilter intentFilter = new IntentFilter("android.intent.action.MAIN");
registerReceiver(mReceiver, intentFilter);
 

 

这样就实现我想要的功能。

 

另外,还有高手说可以使用Service,每个Activity和Service中都创建一个Handler,而这些Handler共用一个Looper。我曾试着使用这种方法,无奈能力极其有限,没能实现。如果有高手实现了,希望能贴出来给大家分享一下!

分享到:
评论
4 楼 qqyumidi 2014-12-09  
这样用广播实现感觉太 “重” 了
3 楼 pandong8183 2012-08-07  
万分感谢你的文章
2 楼 大柳树 2011-08-18  
如果能够创建一个Handler池就好了啊!
1 楼 yxl_hg 2011-04-15  
很好,我也碰到这问题了,要是有更详细的代码就好了

相关推荐

    用handler在两个activity之间传递数据

    资源包括如何在一个activity A里激活另一个activity B。...然后在两个activity之间用handler传输数据。在activity A里定义全局变量handler,用sendMessage来发数据,在handler里数据以消息队列的方式发送。

    android 实例 Activity 之间通过 Handler 通信

    本实例将深入探讨如何利用Handler在两个Activity之间传递数据和触发事件。 一、Handler基础 Handler是Android中的一个关键组件,它主要用于处理由Looper对象分发的消息(Message)。当在主线程(UI线程)中创建一个...

    Fragment与Activity使用Handler进行交互

    本文将深入探讨如何在Fragment和Activity之间使用Handler进行交互。 首先,了解Handler的基本概念。Handler是Android中的一个消息处理类,它主要用来处理运行在主线程中的Message对象。通过创建一个Handler实例并与...

    Activity中的多个Handler处理机制

    为了解决这个问题,可以在`Activity`的`onDestroy()`方法中调用`removeCallbacksAndMessages(null)`,清空`Handler`的所有回调和消息。 5. **使用静态内部类的Handler** 为了避免内存泄漏,一种常见的做法是将`...

    一个activity中多个handler和消息的处理过程

    首先,Handler是Android中的一个关键组件,它允许我们通过Message对象在不同的线程之间传递数据和执行任务。通常,我们在主线程(UI线程)中创建一个Handler实例,用于接收由其他工作线程发送的消息,并在适当的时间...

    Fragment和Activity交互(Handler方式)

    - 为了在Fragment和Activity之间发送消息,可以创建一个公共的接口,让Fragment和Activity都实现该接口,然后在Handler中调用接口方法来传递消息。 3. **处理消息**: - 在Activity的handleMessage()方法中,根据...

    用broadcast在activity之间传递数据

    总结来说,使用Broadcast在Activity之间传递数据是一种灵活且实用的方法,它允许组件间通信而不直接耦合。通过理解BroadcastReceiver、Intent、IntentFilter、Handler等核心概念,开发者可以有效地实现在Android应用...

    利用Handler在线程之间传递数据

    这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。

    Android利用handler在线程之间传递代码

    本篇将深入探讨如何利用Handler在线程之间传递代码,以实现异步处理和保持UI线程的流畅。 首先,理解Handler的基本原理。Handler是Android中的一个消息处理类,它与Looper和Message紧密配合,形成了一个消息队列。...

    Handler使用

    在Android开发中,`Handler`是一个至关重要的组件,主要用于解决线程间的通信问题,尤其是在UI线程和其他工作线程之间。本篇文章将深入探讨`Handler`的使用方法,包括其基本概念、工作原理以及如何避免内存泄露和...

    在一个Activity中更新操作另一个Activity的内容

    4. 如果需要在Activity之间传递复杂的数据,可以考虑使用Parcelable或Serializable接口来序列化数据,并将其作为Intent的额外数据。 总的来说,Android系统提供了多种方式来实现在一个Activity中更新另一个Activity...

    初识 Service(三) 演示:Service给 Activity传递消息

    创建一个Message对象,并通过Binder接口在Service和Activity之间传递。在Service中创建一个Handler,用于处理来自Activity的消息,而在Activity中创建一个Messenger对象,用于发送消息到Service。 ```java // 在...

    安卓handler的使用

    在Android应用开发中,Handler是一种重要的线程通信机制,它与Looper、Message紧密配合,用于在不同的线程间传递消息,解决多线程同步问题。本篇将详细讲解Handler的使用,包括如何创建Handler对象、如何发送和处理...

    基于观察者模式两个activity通信

    在这个场景中,我们关注的是如何使用观察者模式(Observer Pattern)来实现Activity A和C之间的数据交互。观察者模式是一种行为设计模式,它允许一个对象(观察者)在另一个对象(被观察者)的状态改变时自动收到...

    Handler的介绍和使用方法

    然而,过度依赖`Handler`可能导致内存泄漏问题,因为`Handler`持有对创建它的上下文(通常是Activity)的引用,如果未正确关闭,可能会导致Activity无法正常回收。因此,在不需要使用`Handler`时,记得调用`...

    通过Handler进行传递值更新进度条

    这个文件可能是一个完整的示例代码,包含了一个Activity类,展示了如何使用`Handler`从后台线程传递值并更新UI。你可以打开这个文件,查看并学习其中的实现细节。 总结,通过`Handler`机制,我们可以在后台线程中...

    Handler的简单使用

    本篇文章将详细介绍`Handler`的基本概念、工作原理以及如何在一个`Activity`中简单使用它来实现动画效果。 `Handler`的核心功能是发送和处理消息。在Android系统中,主线程负责处理用户交互,如显示界面、更新UI等...

    android中的handler的使用方法

    Handler是Android消息处理系统的一部分,它与Looper和Message紧密协作,用于在不同线程之间传递消息和执行任务。通常,主线程(UI线程)有一个默认的Looper,而其他工作线程需要手动创建Looper。Handler的主要职责是...

    Android传递Bitmap对象在两个Activity之间

    在Android开发中,有时我们需要在不同的Activity之间传递数据,其中包括Bitmap对象和其他支持序列化的Java对象。Bitmap对象通常用于处理图像,比如从网络上下载图片并在ImageView中显示。本篇文章将详细探讨如何通过...

    安卓关于handler的使用

    在实际应用中,你可能还需要关注消息的同步问题,比如避免因为线程间的竞争条件导致数据不一致,或者使用`Handler`的`removeCallbacksAndMessages()`方法来清理未处理的消息,防止内存泄漏。 在提供的文件`thread_...

Global site tag (gtag.js) - Google Analytics