Java 默认接口实现

Java 默认接口实现,java,android,interface,Java,Android,Interface,在Android中,当我使用AsyncTask时,我通常使用接口方法,以便我可以在活动中实现它: public class DownloadTask extends AsyncTask<String, Integer, Response> { private Context context; private DownloadTaskListener listener; private List<MyObject> objectList; public interf

在Android中,当我使用
AsyncTask
时,我通常使用接口方法,以便我可以在
活动中实现它:

 public class DownloadTask extends AsyncTask<String, Integer, Response> {

private Context context;
private DownloadTaskListener listener;
private List<MyObject> objectList;


public interface DownloadObjectsTaskListener {
    void startTask();
    void finishTask();
    void ObjectsDownloaded(List<Object> ObjectList);

    void withoutInternet();
}

public DownloadObjectsTask(Context context) {
    this.context = context;
}


public void setListener(DownloadObjectsTaskListener listener) {
    this.listener = listener;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();

    if (CommonUtils.isThereInternetConnection(context)) {
        listener.startTask();
    } else {
        listener.withoutInternet();
        cancel(true);
    }
}

protected Response doInBackground(String... urls) {
    RestApiObject api2 = new RestApiObject();
    return api2.getMyObjects();

}

protected void onPostExecute(Response results) {
    listener.finishTask();
    if (results != null) {
        if (results.body() != null) {
            ObjectsResponse request = (ObjectsResponse) results.body();
            ObjectList = request.getObjectsList();
            listener.ObjectsDownloaded(ObjectList);
        } else {
            ResponseBody jsonObject = results.errorBody();
            try {
                Log.d(DEBUG, jsonObject.string());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } else {
        Log.d(DEBUG, "result is null");
    }

   }
}
公共类下载任务扩展了异步任务{
私人语境;
私人下载任务监听器;
私有列表对象列表;
公共接口下载ObjectStaskListener{
无效startTask();
void finishTask();
void objects下载(列表ObjectList);
在没有Internet()的情况下无效;
}
公共下载ObjectStask(上下文){
this.context=上下文;
}
公共void setListener(下载ObjectStaskListener listener){
this.listener=listener;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
if(CommonUtils.isThereInternetConnection(上下文)){
listener.startTask();
}否则{
listener.withoutiternet();
取消(真);
}
}
受保护的响应doInBackground(字符串…URL){
RestApiObject api2=新的RestApiObject();
返回api2.getMyObjects();
}
受保护的void onPostExecute(响应结果){
finishTask();
如果(结果!=null){
if(results.body()!=null){
ObjectsResponse请求=(ObjectsResponse)results.body();
ObjectList=request.getObjectsList();
objectsdownload(ObjectList);
}否则{
ResponseBody jsonObject=results.errorBody();
试一试{
d(DEBUG,jsonObject.string());
}捕获(IOE异常){
e、 printStackTrace();
}
}
}否则{
Log.d(调试,“结果为空”);
}
}
}
然后在我的
活动中
,我实现了接口,并定义了方法

对于像
withoutInternet()
这样的方法,方法定义总是相同的,所以每次我重新定义方法实现时,它都只是冗余代码,即使我在方法中提取代码也是如此


有没有一种方法可以在不使用Internet()的情况下定义一次

当然,您想要的是
抽象类而不是
接口。
如下所示:

public abstract DefaultDownloadObjectTasksListener implements DownloadObjectsTaskListener{
    abstract void startTask();
    abstract void finishTask();
    abstract void ObjectsDownloaded(List<Object> ObjectList);

    void withoutInternet(){
      //some default implementation
    }
}
public abstract DefaultDownloadObjectTasksListener实现DownloadObjectsTaskListener{
抽象void startTask();
抽象void finishTask();
抽象无效对象下载(列表对象列表);
在没有Internet()的情况下无效{
//一些默认实现
}
}
然后,您可以
扩展
(而不是
实现
)抽象类,覆盖要为其提供功能的方法。因为前三个方法是
abstract
,所以需要覆盖它们。但是,由于没有Internet的
不是抽象的,因此将使用默认实现,除非您选择覆盖它

编辑以解决您的问题:然后,解决方案将是使您的
DefaultDownloadObjectTasksListener
扩展
AppCompatActivity
并实现
DownloadObjectsTaskListener
,然后从您的活动中扩展
DefaultDownloadObjectTasksListener


或者,如果你真的想要一个默认的实现,我会使用一个匿名的子类作为监听器。

你可以创建一个基本的活动来实现你的接口,实现
withoutInternet()
,并将其他方法声明为抽象的。然后,您的活动将从基本活动扩展您的活动,您只需要实现其他方法。

我无法在我的活动中扩展抽象类,因为活动已经扩展了AppCompatActivity。