Java 默认接口实现
在Android中,当我使用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
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。