`
buddie
  • 浏览: 182655 次
  • 性别: 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  
很好,我也碰到这问题了,要是有更详细的代码就好了

相关推荐

Global site tag (gtag.js) - Google Analytics