2014-09-05 46 views
0

嘗試獲取「回調接口」的句柄。這個概念我的理解意義除了以下如何將對象上下文傳遞給Java中的回調接口

//FromSomeClass1 

MyInterface conect; 

public void setInterface(MyInterface myInter) 
{ 
    this.conect=myInter; 
} 

interface MyInterface 
{ 
    public void update(String str); 
} 

(模糊性從這裏開始) 所以當另一個類的嘗試

//FromSomeClass2 implements MyInterface 
...onCreate() 
{ 
SomeClass1 newC = new SomeClass1() 
newC.setInterface(this) ; 

} 
update(String str){ 
....code 
} 

這是行不通的,因爲我傳遞到一個新的對象?除非我在Class1中製作「conect」變量static(好主意壞主意......後果???)

簡單地說,將對象傳遞迴「setInterface」方法的正確方法是什麼。

希望有道理,謝謝。

p.s. 所有那些誰想要呼叫的一個很好的理解支持這一link will help.

+2

你的問題沒有意義。你通常會做'MyInterface newC = new SomeClass1();'(new不是可選的),然後'newC.update(「Hello」);',你到底在做什麼? – 2014-09-05 23:19:57

+0

@ Elliot Frisch我只是試圖在step1 ... step2..step3..sort的方式中掌握正確的概念。閱讀文檔讓我進入了圈子。目標是僅在需要時回調到不同類中的更新方法。謝謝。 – AhabLives 2014-09-05 23:27:56

回答

1

考慮一個例子Animal接口與一個says(String)回調,

interface Animal { 
    public void says(String msg); 
} 

接下來,讓我們添加使用Animal接口說點什麼類 -

class Say { 
    public void say(Animal animal) { 
     animal.says("Bawk"); 
    } 
} 

現在,讓我們實現兩個不同的Animal(S) - 我們將有一個Cow級和Sheep類,

class Cow implements Animal { 
    public void says(String msg) { 
     System.out.printf("%s, I mean moo!%n", msg); 
    } 
} 

class Sheep implements Animal { 
    public void says(String msg) { 
     System.out.printf("%s, I mean baah!%n", msg); 
    } 
} 

最後,爲了證明我們在上面定義的回調方法 -

public static void main(String[] args) { 
    Say say = new Say(); 
    say.say(new Cow()); 
    say.say(new Sheep()); 
} 

輸出是

Bawk, I mean moo! 
Bawk, I mean baah! 
+0

你的漫步通過幫助很大。你能否澄清一下:我已經看過並閱讀了2種回調技術1是你的方式,另一種是公共無效setInterface(MyInterface myInter) this.conect = myInter; } ..(這將與接口類一起)..方式。我是否瘋了有2個回叫技巧,如果有的話有什麼區別。謝謝。 – AhabLives 2014-09-06 00:34:59

+0

@AhabLives在我上面的代碼中,考慮'說(String msg)'。如果它變成了「說(說)」?然後'說(動物動物)'可能有'animal.says(this);'。這是同一件事。 – 2014-09-06 00:40:17

+0

弗裏施哇...這可能是要求太多,但你可以胡椒代碼上面的「//相當於.. animal.says(this);」方式...我告訴你...你會爲很多初學者節省大量的頭痛。非常感謝所有的幫助。 – AhabLives 2014-09-06 00:55:24

0

這不正是你需要使它靜。我的意思是,你可以使SomeClass1中的所有東西,並通過調用靜態方法使客戶端註冊SomeClass1.setInterface(this) 我不會推薦這麼做。這是一個例子休耕代碼:

import java.util.HashSet; 
import java.util.Set; 

public class CallbackExample { 

    interface MyInterface { 
    public void update(String str); 
    } 

    static class SomeClass1 { 
    private Set<MyInterface> connects = new HashSet<MyInterface>(); 

    public void register(MyInterface myInter) { 
     this.connects.add(myInter); 
    } 

    public void doWork(String someParam) { 
     for (MyInterface myInterface : connects) { 
     myInterface.update(someParam); 
     } 
    } 
    } 

    static class SomeClass2 implements MyInterface { 
    public void onCreate(SomeClass1 caller) { 
     caller.register(this); 
    } 

    @Override 
    public void update(String str) { 
     System.out.println("Doing some logic in update for " + str); 
    } 
    } 

    public static void main(String[] args) { 

    // Caller and callback creation are decoupled 
    SomeClass1 caller = new SomeClass1(); 
    SomeClass2 callback = new SomeClass2(); 

    // alternative 1. Preferred 
    caller.register(callback); 

    // alternative 2. Fallowing your example 
    callback.onCreate(caller); 

    caller.doWork("param1"); 
    } 

} 
0

使用回調的一個很好的例子是android-async-http庫。要發出HTTP請求,您需要調用一個方法並將請求的細節和實現特定回調接口的對象一起傳遞。請求方法立即返回,但在請求完成後,庫的工作線程在主線程中爲您提供的回調對象上的方法建立一個調用。

相關問題