我对接口不太熟悉,所以我想知道,将一个活动的引用传递给asynctask,然后在onPostExecute中调用该活动的方法有什么区别。这些例子之间有什么区别,为什么要使用界面
界面示例
public interface OnTaskCompleted{
void onTaskCompleted();
}
的活动:
public YourActivity extends Activity implements OnTaskCompleted{
}
的AsyncTask:
public YourTask extends AsyncTask<Object,Object,Object>{
private OnTaskCompleted listener;
public YourTask(OnTaskCompleted listener){
this.listener=listener;
}
protected void onPostExecute(Object o){
listener.onTaskCompleted();
}
}
活动示例
的活动:
public YourActivity extends acitivty {
public myCallbackMethod(){
//do something
}
}
的AsyncTask
public YourTask extends AsyncTask<Object,Object,Object>{
private YourActivity act;
public YourTask(YourActivity act){
this.act=act;
}
protected void onPostExecute(Object o){
act.myCallbackMethod();
}
}
答案 0 :(得分:4)
这主要是品味和设计风格。该界面提供的优势是您不会必需向Activity
发送AsyncTask
。相反,您可以选择创建一个实现接口的单独类。
答案 1 :(得分:1)
我只想让上面的答案更清楚:
这里没有明显区别。但总的来说,在 OOP 的世界中,你可以找到很多让你使用设计模式程序接口的基本原理的例子。这是一个让你使用这种模式的简单例子:
考虑你有一个对象A作为基类,你将它传递给你的另一个类B来调用类f
的方法A
,所以在这个场景中你必须在标题中声明一个B的一个功能。显然B只接受A及其子。现在考虑您希望一个名为C的类具有函数f
,并且您希望从B
调用该函数。显然,从A扩展C不是一个好主意,因为它们没有任何Is-A
关系,所以你应该怎么做?再次声明B中的另一个函数接受来自C
的引用。这不是一个好主意,因为过了一段时间你可能需要一个名为D
的其他对象来调用它的f方法。所以为了防止这种情况,你声明一个接口并使每个类都实现它,在这种情况下,你必须在对象B中声明一个接受该接口作为引用的方法。实现该接口的每个对象都可以传递给您的B类。
现在考虑要创建一个库,并且需要从用户对象中调用一个方法。例如,调用已成功下载所请求图像的方法。如果您接受活动的引用,则用户必须在活动中使用您的代码,并且不能在服务中使用它。所以你必须提供接受服务,活动,片段等的不同功能。而不是你只是说我只接受这个接口,每个人都想使用它。