首页 > 解决方案 > 侦听器接口如何或为什么工作?除了作为侦听器之外,接口还有其他用途吗?

问题描述

每当我们想创建一个监听器时,我们都会实现一个监听器接口。例如,让我们实现SensorEventListener.

现在我们必须重写这个监听器接口的方法。

public void onSensorChanged(SensorEvent event);

public void onAccuracyChanged(Sensor sensor, int accuracy);

我不明白的是:

  1. 当我自动使用这些方法时,它们为什么以及如何工作?
  2. 为什么onAccuracyChanged在精度发生变化时会调用方法?
  3. 毕竟,onAccuracyChanged它只是一个我们重写的空方法,因为我们的公式(或我们实现的接口)要求我们这样做。如果是低层造成的魔法
  4. 何时以及为什么有人会在他/她的自我项目中实际使用界面,而不管 android 是什么?

标签: javaandroidlistenerimplements

解决方案


这是一个合适的答案。请允许我举一个关于听众的例子。

听众:

假设有一个在后台获取数据的类Worker, 和另一个对该数据感兴趣的类,InterestedClass

public class Worker extends Thread{
  interface DataFetchedListener{
    void onDataFetched(String data);
  }

  private DataFetchedListener listener;

  @Override
  public void run(){
   String data = fetchData();
   // Data fetched inform your listener so he can take action
   listener.onDataFetched(data);
  }

  public void setDataFetchedListener(DataFetchedListener listener){
   this.listener = listener;
  }

  private String fetchData(){
    // returns the fetched data after some operations
    return "Data";
  }
}


public class InterestedClass implements Worker.DatafetchedListener{

 @Override
 public void onDataFetched(String data){
  doSomethingWith(data);
 }

 private doSomethingWith(String data){
  // just print it in the console
  System.out.println("Data fetched is -> " + data);
 }

}

不关心哪个类将操作其数据,Worker只要该类遵循.DataFetchedListener

同样,这意味着任何类都可以对数据做一些事情(InterestedClass只是在控制台中打印它),但Worker不需要知道是哪个类,只需要它实现它的接口即可

主线可以这样...

public class Application{
  public static void main(String[] args){
   InterestedClass interested = new InterestedClass();
   Worker worker = new Worker();
   worker.setDataFetchedListener(intereseted);
   worker.start(); // Starts Worker's thread
  }
} 

Worker将获取数据时,它将通知其侦听器(当前为interested对象),侦听器将采取相应的行动(interested将数据打印到控制台)。


推荐阅读