为什么我们使用接口进行回调而不是仅仅传递对活动的引用

时间:2014-09-28 00:22:37

标签: java android

我对接口不太熟悉,所以我想知道,将一个活动的引用传递给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();
    }
}

2 个答案:

答案 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类。

现在考虑要创建一个库,并且需要从用户对象中调用一个方法。例如,调用已成功下载所请求图像的方法。如果您接受活动的引用,则用户必须在活动中使用您的代码,并且不能在服务中使用它。所以你必须提供接受服务,活动,片段等的不同功能。而不是你只是说我只接受这个接口,每个人都想使用它。