在我的开发工作中,遇到了这样一种问题:一个非主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。我曾试着使用这种方法,无奈能力极其有限,没能实现。如果有高手实现了,希望能贴出来给大家分享一下!
分享到:
相关推荐
资源包括如何在一个activity A里激活另一个activity B。...然后在两个activity之间用handler传输数据。在activity A里定义全局变量handler,用sendMessage来发数据,在handler里数据以消息队列的方式发送。
本实例将深入探讨如何利用Handler在两个Activity之间传递数据和触发事件。 一、Handler基础 Handler是Android中的一个关键组件,它主要用于处理由Looper对象分发的消息(Message)。当在主线程(UI线程)中创建一个...
本文将深入探讨如何在Fragment和Activity之间使用Handler进行交互。 首先,了解Handler的基本概念。Handler是Android中的一个消息处理类,它主要用来处理运行在主线程中的Message对象。通过创建一个Handler实例并与...
为了解决这个问题,可以在`Activity`的`onDestroy()`方法中调用`removeCallbacksAndMessages(null)`,清空`Handler`的所有回调和消息。 5. **使用静态内部类的Handler** 为了避免内存泄漏,一种常见的做法是将`...
首先,Handler是Android中的一个关键组件,它允许我们通过Message对象在不同的线程之间传递数据和执行任务。通常,我们在主线程(UI线程)中创建一个Handler实例,用于接收由其他工作线程发送的消息,并在适当的时间...
- 为了在Fragment和Activity之间发送消息,可以创建一个公共的接口,让Fragment和Activity都实现该接口,然后在Handler中调用接口方法来传递消息。 3. **处理消息**: - 在Activity的handleMessage()方法中,根据...
总结来说,使用Broadcast在Activity之间传递数据是一种灵活且实用的方法,它允许组件间通信而不直接耦合。通过理解BroadcastReceiver、Intent、IntentFilter、Handler等核心概念,开发者可以有效地实现在Android应用...
这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。
本篇将深入探讨如何利用Handler在线程之间传递代码,以实现异步处理和保持UI线程的流畅。 首先,理解Handler的基本原理。Handler是Android中的一个消息处理类,它与Looper和Message紧密配合,形成了一个消息队列。...
在Android开发中,`Handler`是一个至关重要的组件,主要用于解决线程间的通信问题,尤其是在UI线程和其他工作线程之间。本篇文章将深入探讨`Handler`的使用方法,包括其基本概念、工作原理以及如何避免内存泄露和...
4. 如果需要在Activity之间传递复杂的数据,可以考虑使用Parcelable或Serializable接口来序列化数据,并将其作为Intent的额外数据。 总的来说,Android系统提供了多种方式来实现在一个Activity中更新另一个Activity...
创建一个Message对象,并通过Binder接口在Service和Activity之间传递。在Service中创建一个Handler,用于处理来自Activity的消息,而在Activity中创建一个Messenger对象,用于发送消息到Service。 ```java // 在...
在Android应用开发中,Handler是一种重要的线程通信机制,它与Looper、Message紧密配合,用于在不同的线程间传递消息,解决多线程同步问题。本篇将详细讲解Handler的使用,包括如何创建Handler对象、如何发送和处理...
在这个场景中,我们关注的是如何使用观察者模式(Observer Pattern)来实现Activity A和C之间的数据交互。观察者模式是一种行为设计模式,它允许一个对象(观察者)在另一个对象(被观察者)的状态改变时自动收到...
然而,过度依赖`Handler`可能导致内存泄漏问题,因为`Handler`持有对创建它的上下文(通常是Activity)的引用,如果未正确关闭,可能会导致Activity无法正常回收。因此,在不需要使用`Handler`时,记得调用`...
这个文件可能是一个完整的示例代码,包含了一个Activity类,展示了如何使用`Handler`从后台线程传递值并更新UI。你可以打开这个文件,查看并学习其中的实现细节。 总结,通过`Handler`机制,我们可以在后台线程中...
本篇文章将详细介绍`Handler`的基本概念、工作原理以及如何在一个`Activity`中简单使用它来实现动画效果。 `Handler`的核心功能是发送和处理消息。在Android系统中,主线程负责处理用户交互,如显示界面、更新UI等...
Handler是Android消息处理系统的一部分,它与Looper和Message紧密协作,用于在不同线程之间传递消息和执行任务。通常,主线程(UI线程)有一个默认的Looper,而其他工作线程需要手动创建Looper。Handler的主要职责是...
在Android开发中,有时我们需要在不同的Activity之间传递数据,其中包括Bitmap对象和其他支持序列化的Java对象。Bitmap对象通常用于处理图像,比如从网络上下载图片并在ImageView中显示。本篇文章将详细探讨如何通过...
在实际应用中,你可能还需要关注消息的同步问题,比如避免因为线程间的竞争条件导致数据不一致,或者使用`Handler`的`removeCallbacksAndMessages()`方法来清理未处理的消息,防止内存泄漏。 在提供的文件`thread_...