如何将对象上下文传递给Java中的回调接口

时间:2014-09-05 23:17:48

标签: java interface

尝试处理"回调接口"。我理解的概念除了以下

之外有意义
//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  
 }

这不起作用,因为我传递给一个新对象?除非我制作" conect" Class1静态中的变量(好主意坏主意......后果???)

将对象传递回" setInterface"的正确方法是什么?方法。

希望有意义,谢谢你。

P.S。 对于那些希望对回调这个link will help.

有良好理解的人

3 个答案:

答案 0 :(得分:2)

考虑一个示例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!

答案 1 :(得分: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");
  }

}

答案 2 :(得分:0)

使用回调的一个很好的例子是android-async-http库。要发出HTTP请求,可以调用方法并传递请求的详细信息以及实现某个回调接口的对象。请求方法立即返回,但在请求完成后,库的工作线程在主线程中将调用设置为您提供的回调对象上的方法。