默认接口实现

时间:2015-10-23 17:58:06

标签: java android interface

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

 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");
    }

   }
}

然后在我的Activity中,我实现了接口,并定义了方法。

对于诸如withoutInternet()之类的方法,方法定义将始终相同,因此每次重新定义方法实现时它都只是冗余代码,即使我在方法中提取代码。

有没有办法定义一次withoutInternet()

2 个答案:

答案 0 :(得分:2)

当然,你想要一个abstract课而不是interface.这样:

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

    void withoutInternet(){
      //some default implementation
    }
}

然后你可以extend(而不是implement)覆盖你想要提供功能的方法的抽象类。由于前三种方法是abstract,因此您需要覆盖它们。但是,因为withoutInternet不是抽象的,所以将使用默认实现,除非您选择覆盖它。

修改要解决您的问题:解决方案是让您的DefaultDownloadObjectTasksListener延长AppCompatActivity并实施DownloadObjectsTaskListener,然后展开DefaultDownloadObjectTasksListener来自你的活动。

或者,实际上,如果您真的想要默认实现,我会使用匿名子类作为侦听器。

答案 1 :(得分:0)

您可以创建实现接口的基本活动,实现/myDbPath/myDb.nsf/undefined,并将其他方法声明为抽象。然后,您的活动将从基础活动扩展您的活动,您只需要实现其他方法。