在我的开发工作中,遇到了这样一种问题:一个非主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里数据以消息队列的方式发送。
android 实例 Activity 之间通过 Handler 通信
这里简单介绍了Fragment和Activity使用Handler方式进行交互。
这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。
这个demo演示了在handler之间传递代码
深入底层剖析,一个activity中多个handler和消息的处理机制。
深入底层剖析,一个activity中多个handler和消息的处理过程,
Fragment和Activity交互(Handler方式),可互相改变彼此UI
用broadcast在两个activity之间传递数据,能保证application的UI保持不变,是当前activity的UI,接收数据的activity执行对应动作。
通过内部存储方式实现了在两个Activity之间传递Bitmap对象以及其它支持串行化的Java对象,关键点有如下: 1. HTTP客户端下载图片,通过ImageView对象显示 2. 把ImageView上的Bitmap对象从当前Activity传递到另外...
实现 如何在两个activity之间传递数据。 定义自己的application,并用application在两个activity之间传递handler,把数据放在handler里面
整理了Handler的各种使用方法
Handler与AsyncTask使用示例,Handler AsyncTask 示例 looper
handler的使用演示,主线程给子线程发消息,子线程给主线程发消息
利用广播和Handler进行多个页面间通信,比如ActivityA,ActivityB,ActivityC三个页面,从A->B ->C C做完某些操作后,需要更新A和B中的页面或者调用A和B中的方法时,在此例子中能找到你想要的!
解决这个问题的方法有两种: 减少notifyItemChanged的调用次数,尽量在数据变化后一次性更新多个item,而不是频繁地更新单个item。 使用DiffUtil来计算RecyclerView中item数据的变化,然后批量更新变化的item。...
通过Handler进行传递值更新进度条,源代码,希望对你有所帮助
Handler的基本使用,通过Handler更新UI中TextView的显示
简单的在一个Activity里实现一个简单的动画。Handler用来传值,在run方法里执行动态的显示过程。
这是Handler的介绍和使用方法Demo,介绍请参考:http://write.blog.csdn.net/postlist