繁体   English   中英

具有默认内部类的Java接口

[英]Java Interface with Default Inner Class

我正在编写一个具有两个不同后台服务的android应用,一个用于发送和接收来自服务器的请求,另一个用于从url下载图像。 应用程序的多个页面需要执行这些活动,因此我编写了两个接口,用于处理服务器请求的RequestReceiver和用于下载图像的ImageReceiver。

为了在Android中接收广播的意图,我正在扩展BroadcastReceiver类并覆盖其onReceive()方法。 这应该通过意图中的内部类来完成,该意图在实现该类的类中调用一个方法。 但是,我不能从我的静态内部类中调用非静态方法。

public interface RequestReceiver {
    void handleRequest(int status, JSONObject object);

    class Receiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            int status = intent.getIntExtra("STATUS", -1);
            try {
                JSONObject object = new JSONObject(intent.getStringExtra("DATA"));
                handleRequest(status, object);
            } catch (JSONException e) {
                Log.e(this.toString(), "JSONException");
                e.printStackTrace();
            }
        }
    }
}

这不会编译:

non-static method cannot be referenced from a static context

我应该怎么做?

编辑:我不能使用抽象类的原因是我需要多重继承。 有些活动需要是ImageDownloader,而不是RequestReceivers,反之亦然。 同样,实现此接口的类已经从其他类继承。 有些扩展了Fragment,另一些扩展了Activity,但是它们都需要访问这些功能。 因此,它必须是一个接口。

您可以将包含非静态方法的外部类的对象传递到静态内部类中。 这可以通过构造函数或setter方法完成。 传入的对象应分配给静态内部类的成员变量。

然后,您可以使用传递到静态内部类构造函数或setter中的外部类的对象来调用非静态方法。

您可以执行以下操作:

public interface RequestReceiver {
    void handleRequest(int status, JSONObject object);

    class MyBroadcastReceiver extends BroadcastReceiver {

        private final RequestReceiver requestReceiver;

        public MyBroadcastReceiver(RequestReceiver requestReceiver) {
            this.requestReceiver = requestReceiver;
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            int status = intent.getIntExtra("STATUS", -1);
            try {
                JSONObject object = new JSONObject(intent.getStringExtra("DATA"));
                requestReceiver.handleRequest(status, object);
            } catch (JSONException e) {
                Log.e(this.toString(), "JSONException");
                e.printStackTrace();
            }
        }
    }
}

我没有尝试代码...所以可能会有一些错误...但是你明白了

在跳入StackOverflow之前,我应该喝咖啡。

无论如何…

您正在尝试从静态内部类访问非静态方法(这就是Java的工作方式)。

尽管提供了一些提供解决方法的方法,但这通常会突出显示更高级别的体系结构问题。

为什么在接口中有一个类,为什么该类是BroadcastReceiver?

您不应该尝试以不同的方式抽象一下吗?

我个人会对这种代码不满意。 您试图在代码中解释的目的是什么? 当我阅读此代码时,应该从中推断出什么? 这种界面的意图是什么?

我是否应该使用此接口并关心其中是否有广播接收器?

我认为您应该重新考虑以其他方式编写此代码,而不是尝试与工具/语言作斗争。

我将如何处理您的问题?

应用程序的多个页面需要执行这些活动

1)发送和接收来自服务器的请求

2)从url下载图像

为什么不在抽象类中创建这些实现,每个活动在需要此类行为时可以扩展这些抽象类。 (如果您确实需要这些方法,可以稍后再对其进行接口)。

每个实现的细节都与孩子无关。 如果您的“图像下载器”代码发生更改,您也不想更改每个活动。

重新考虑你的问题:)

更新:

我感到您在“面向对象”世界中迷路了。 我强烈建议您看一下这本(旧但仍然有效)的书:Robert C. Martin撰写的《 敏捷软件开发,原理,模式和实践》

不要被它的标题所迷惑,这不是一本有关“ Scrum会议”的书。

我不特别知道有关您的问题的实现细节,但是我建议您重新考虑您的设计。 图像下载和网络请求/响应本身与活动无关,并且不必由活动通过接口来实现。

您应该考虑采用一种更加“面向工厂”的方法(而且我讨厌命名“模式”,因为我认为它们倾向于使事情“过于复杂”)。

尽管我不同意另一本书中的建议,但我还是推荐100%。 我从中学到了一些有趣的东西,我认为这是几年后写的《敏捷》的前传;)

必须发出请求的Activity应调用您的DAO(数据访问对象)并请求数据。 数据可能来自网络,可能来自本地缓存,可能来自本地文件,谁知道。 该活动当然不在乎。 而且不应该。

从URL下载图像可能留给了像Picasso这样简单而健壮的库,但是如果您坚持要编写自己的库,则实现和用法决不应与特定的Activity绑定。

没有更多信息,很难说出您所面临的确切问题以及如何解决该问题。

您的特定问题(非静态方法错误)清楚地表明您正在尝试采用非标准/ hacky解决方案,并且应该采取一些措施,以免为时已晚(如我所链接的第二本书)会很高兴地解释);)

暂无
暂无

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

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