繁体   English   中英

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

[英]android development - using android.os.Handler for inter class communication

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

把它放到一个例子中。 我不想定义特定Activity在同一个类中的所有对话框(在该活动中发生了一系列的Dialog)所以我实现了一个DialogManager类来定义和保存所有潜在的Dialog,从而移交一个处理器实例对此DialogManager的活动并使用它来通知活动发生了什么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。 相当直接在我看来...

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

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

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

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

EventBus非常酷,而且Guava库中有很多很棒的功能。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM