android开发 - 使用android.os.Handler进行类间通信

时间:2012-09-19 13:49:13

标签: android architecture

我作为Android开发新手的一个挣扎是我的课程倾向于使用gui监听器等所有内部类等相当广泛。所以我提出了一个分解我的课程的解决方案,我想听听安卓专家的一些反馈。

把它放到一个例子中。我不想定义特定Activity在同一个类中的所有对话框(该活动中发生了一系列对话) 所以我实现了一个DialogManager类来定义和保存所有潜在的Dialog,将一个处理程序实例从Activity移交给这个DialogManager,并使用它来通知Activity有关发生了什么gui事件。

这里是这个DialogManager类的片段,mHandler是回调Activity的处理程序

mDownloadDialog = new ProgressDialog(mContext);

mDownloadDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "Cancel",
                new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {                      

                        mDownloadDialog.dismiss();

                        Message message = mHandler.obtainMessage();
                        message.arg1 = DOWNLOAD_DIALOG;
                        message.arg2 = AlertDialog.BUTTON_NEGATIVE;
                        message.sendToTarget();
                    }
                });

所以这很有效,我对现在更有条理的源代码感到满意,但是我想知道Handler类是否是正确的方法,或者这是否有点矫枉过正,有一些更好的方法来实现相同的推荐的结果。

编辑: 正如博尔德指出的那样

处理程序消息不会立即执行

因此,考虑到这一点,使用Handler并不是正确的方法。

下一个想法就像在给定示例中定义接口

一样简单
public interface DialogEventReceiverInterface { 
public void dialogEvent(int dialog,int button);
}

在Activity中实现该接口,将活动交给DialogManager,并在发生事件时调用dialogEvent。相当直接,现在在我看来......

2 个答案:

答案 0 :(得分:1)

这可能不是您正在寻找的100%,但它可能会解决您在Android应用中遇到的问题。

我经常会遇到很多内部类侦听器,例如在处理大量UI事件时,另一个选择是发布 - 订阅。您发布事件和对象的位置订阅特定事件。在Android中,谷歌拥有一套他们使用的名为Guava的甜蜜图书馆,这些图书馆有很多优秀的东西。其中一个是EventBus,这使得这更容易。

http://code.google.com/p/guava-libraries/wiki/EventBusExplained

他们在那里有一些很好的例子并引导你完成它。这是一个很大的改变,也是一种不同的思维方式,所以我不会在没有调查的情况下跳进去。确保它适合您的项目。

EventBus很酷,Guava库中有很多很棒的功能。

答案 1 :(得分:1)

我很欣赏你不一定要专门询问整理与Dialog相关的混乱,而是你展示的Dialog代码只是我想你的一个更广泛问题的例证。要求设计模式来解决。

但是,专注于Dialog的具体示例,Android API现在已经以Fragment s和DialogFragment的形式为此提供了更清晰的解决方案。使用Fragment类是一种更简洁的方法,因为您通常在单独的类文件中定义DialogFragment。 Android API文档包含有关如何处理DialogFragment和父Activity之间通信的非常好的指南。

在我切换到使用Fragment s之前,我最终在Dialog个类中创建了很多Activity个,我尝试了各种设计模式和对话管理器等等但是,在我看来,Fragment方法更加清晰。

与早期Android版本的兼容性没有问题,因为您可以使用V4支持包。