在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()
?
答案 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
,并将其他方法声明为抽象。然后,您的活动将从基础活动扩展您的活动,您只需要实现其他方法。