0

我有一个Plugin.java类,我在其中定义了两种方法,一种是使用 JobScheduler(如果 API >= 21),另一种是使用 AlarmManager(如果 API < 21)。

@Override
public void onCreate() {
    super.onCreate();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        scheduleDeleteJobScheduler(...);
    } else {
        scheduleDeleteAlarmManager(...);
    }
}

scheduleDeleteJobScheduler() 方法使用 JobService 删除我在数据库中的一些旧条目。

public class ScheduleDeleteService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {
        deleteOldEntries();
        jobFinished(params, false);
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }

    public void deleteOldEntries(){...}
}

scheduleDeleteAlarmManager() 方法使用 BroadcastReceiver 来做与 JobService 相同的事情。

public class ScheduleDeleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        deleteOldEntries();
    }

    public void deleteOldEntries(){...}
}

这两个类都调用 deleteOldEntries() 方法从数据库中删除旧条目。此方法对(JobService 和 BroadcastReceiver)都是相同的。我想要做的是避免有两种实现相同的方法。

  • 因为我已经在扩展 JobService 和 BroadcastReceiver,所以我不能使用 Abstract 或 Super 类。我知道 Java 不允许我扩展多个类,因为它会导致编译器无法决定使用哪个超类方法的“钻石问题”。
  • 通过使用接口,我只能声明没有实现的方法(方法签名)。
  • 我知道我可以使用静态和默认方法(使用接口),但它们是在 Java 8(Android Nougat - API 24)中引入的。因此,如果我使用它们,使用 JobScheduler (API >= 21) 和 AlarmManager (API < 21) 的整个逻辑将毫无意义。

我可以让另一个类实现该方法,然后从 ScheduleDeleteService (JobService) 和 ScheduleDeleteReceiver (BroadCastReceiver) 类中调用它,但我想要一些建议来帮助我更好地实现。

4

2 回答 2

1

还有一个选项选项:您可以按照接口的想法并将实现放在匿名类中。因此,您需要一个单独的接口和实现类,但只需要一个额外的文件。当然,如果可能的话,默认方法/多重继承的解决方案看起来会更优雅。

OldEntriesCleaner.java

interface OldEntriesCleaner {
    void deleteOldEntries();
}

主要活动

@Override
public void onCreate() {
    super.onCreate();

    OldEntriesCleaner cleaner = new OldEntriesCleaner() {
        @Override
        public void deleteOldEntries() {
            // Do the work here
        }
    };
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        scheduleDeleteJobScheduler(..., cleaner)
    } else {
        scheduleDeleteAlarmManager(..., cleaner)
    }
}

服务

public class ScheduleDeleteReceiver extends BroadcastReceiver {

    private OldEntriesCleaner cleaner;

    public ScheduleDeleteReceiver(OldEntriesCleaner cleaner) {
        this.cleaner = cleaner;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        cleaner.deleteOldEntries();
    }

}
于 2018-03-28T19:03:35.137 回答
0

正如我们可以在抽象方法和类中找到的:

如果这些陈述中的任何一个适用于您的情况,请考虑使用抽象类:

  • 您希望在几个密切相关的类之间共享代码。
  • ...

首先,我实现了 ScheduleDelete 抽象类:

abstract class ScheduleDelete {
    public void deleteOldEntries(){ ... }
}

之后,在 ScheduleDeleteService 类中,我调用了 ScheduleDelete#deleteOldEntries() 方法:

public class ScheduleDeleteService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {
        (new ScheduleDelete(){}).deleteOldEntries();
        jobFinished(params, false);
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }
}

在 ScheduleDeleteReceiver 类中,我调用了 ScheduleDelete#deleteOldEntries() 方法:

public class ScheduleDeleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        (new ScheduleDelete(){}).deleteOldEntries();
    }
}
于 2018-04-17T16:02:15.777 回答