2014-09-28 36 views
2

我對接口不是很熟悉,所以我想知道,將活動的引用傳遞給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

也許你想問的是「爲什麼程序接口?」 – 2014-09-28 01:39:08

回答

4

這主要是品位和設計風格的問題。該接口的優點是您不需要需要才能將Activity發送到AsyncTask。相反,您可以選擇創建一個單獨的類來實現接口。

1

我只想讓上面的回答是清楚些:

的差異沒有在這裏清楚地顯示。但在總體上和在世界OOP,你可以找到很多例子,讓你使用這個設計模式的基本原理程序接口。這裏是一個快速的例子,可以讓你使用這種模式:

考慮到你有一個對象A作爲基類,並將它傳遞給其他B類以調用類A的方法f,所以在這種情況下,你必須聲明A在B函數的頭部。因此顯然B只接受A及其子元素。現在考慮您想要一個名爲C的類具有函數f,並且您想從B調用該函數。顯然,從A擴展C並不是一個好主意,因爲他們沒有任何關係,所以你應該怎麼做?再次聲明B中的另一個函數接受來自C的引用。這不是一個好主意,因爲過了一段時間,您可能需要其他對象D來調用它的f方法。所以爲了防止出現這些情況,你需要聲明一個接口並讓每個類都實現這個接口,在這個場景中,你必須在對象B中聲明一個接受該接口作爲參考的方法。每個實現該接口的對象都可以傳遞給你的B類。

現在考慮你想創建一個庫,你需要從你的用戶對象中調用一個方法。例如調用所請求的圖像已被成功下載的方法。如果您接受活動的參考,則用戶必須在活動中使用您的代碼,並且不能在服務中使用它。所以您必須提供接受服務,活動,片段等的不同功能。而不是你只是說我只接受這個接口,每個人都想使用這個接口。

相關問題