Как или почему работают интерфейсы слушателя?И имеют ли интерфейсы какое-либо иное применение, а не быть слушателем? - PullRequest
0 голосов
/ 01 декабря 2018

Всякий раз, когда мы хотим создать слушателя, мы реализуем интерфейс слушателя.Например, давайте реализуем SensorEventListener.

Теперь мы должны переопределить методы этого интерфейса слушателя.

public void onSensorChanged(SensorEvent event);

и

public void onAccuracyChanged(Sensor sensor, int accuracy);

Что я не понимаю:

  1. Почему и как эти методы работают, когда я автоматически их использую?
  2. Почему метод onAccuracyChanged вызывается при изменении точности?
  3. В конце концов, onAccuracyChanged - это просто пустой метод, который мы переопределяем, потому что наша формула (или интерфейс, который мы реализуем) требуетнам сделать это.Если это что-то магическое, вызванное низшими уровнями
  4. Когда и почему кто-то на самом деле использует интерфейс в своем проекте, независимо от Android?

Ответы [ 4 ]

0 голосов
/ 01 декабря 2018

В вычислениях интерфейс - это общая граница, через которую два или более отдельных компонента компьютерной системы обмениваются информацией. (Википедия)

Вы можете захотеть ответить на некоторые события либосистемные события или пользовательские события.Но для этого вам нужно знать, когда происходит событие, которое вы хотите запечатлеть, а также что нужно сделать в это время.

И для этого вы открываете конфиденциальный EAR для прослушивания событий.Но этого будет недостаточно, так как вам нужно также получать уведомления, чтобы вы могли ответить в соответствии с событием.Вы устанавливаете обратных вызовов , которые будут уведомлять, когда происходит событие.Те пустые методы тела, которые мы создаем внутри интерфейса.

Слушатель - это тот интерфейс, который слышит и отправляет обратные вызовы.

Так как все это можно использовать?И как все они взаимодействуют?

  • Сначала создайте интерфейс с методами пустых тел, которые вы намереваетесь вызывать при возникновении события:
public interface MyListener{

      void actionOneHappens(Object o);
      void actionTwo();
      void actionThree();

}
  • Создайте класс, который обрабатывает что-то, например, считает:
public class MyCounter{
//create a member of type MyListener if you intend to exchange infos

private MyListener myListener;

//let's create a setter for our listener
public void setMyListener(MyListener listener)
{
this.myListener=listener;
}

  MyCounter(){

  }
//this method will help us count
public void startCounting()
{
  new CountDownTimer(10000,1000)
       {

           @Override
           public void onTick(long millisUntilFinished) {

            //I want to notify at third second after counter launched

            if(millisUntilFinished/1000==3)
            {
              // I notify if true :
              //as someone can forget to set the listener let's test if it's not //null
              if(myListener!=null){
                 myListener.actionThree();
              }


            }

           }

           @Override
           public void onFinish() {

           }
       }.start();
}




}
  • Затем вы можете создать объект типа MyCounter и узнать, когда он равен трем:

MyCounter myCounter=new MyCounter();

myCounter.setMyListener(new MyListener()
{
//then override methods here
  @override
  void actionOneHappens(Object o){
  }
  @override
  void actionTwo()
  {}

  @override
  void actionThree()
  {
   //Add you code here
   Toast.makeText(getApplicationContext(),"I'm at 3",Toast.LENGTH_LONG).show()
   }



});

//start your counter
myCounter.startCounting();

И это сделано !!Вот как мы поступаем.

0 голосов
/ 01 декабря 2018

Нет волшебной вещи.Как правило, механизм прослушивателя событий выглядит следующим образом:

Для некоторых объектов существует возможность прослушивания некоторых событий в этом объекте (пусть этот объект называется генератором событий).Таким образом, должен существовать какой-то способ для других сущностей прослушивать эти изменения (пусть эти сущности называются слушателями).Теперь слушатель регистрируется как слушатель генератора событий.Когда событие происходит в генераторе событий, он вызывает связанный метод зарегистрированных слушателей.

В качестве простого примера предположим кнопку.Кнопка может генерировать событие для некоторых действий, таких как щелчок.Теперь, если слушатель хочет знать, когда нажимается кнопка, он должен зарегистрироваться как слушатель этой кнопки.С другой стороны, кнопка должна обеспечивать унифицированный способ регистрации слушателей.Этот унифицированный способ - интерфейс.Каждая сущность, которая реализует интерфейс, может зарегистрировать себя в качестве прослушивателя для нажатия на эту кнопку:

1 - Слушатель реализует интерфейс 2 - Слушатель регистрируется как прослушиватель кнопки (Генератор событий) 3 - Генератор событий вызываетподходящий метод для всех зарегистрированных слушателей (этот метод является методом интерфейса).

Для вашего случая, Android предоставляет менеджер, с помощью которого вы можете зарегистрировать слушателя на некоторых датчиках: android.hardware.SensorManager.registerListener().Все происходит здесь (что не волшебство!).Когда вы регистрируете объект (который реализовал связанный интерфейс, SensorEventListener) в качестве прослушивателя датчика, изменения в этом датчике вызовут вызов методов прослушивателя).

0 голосов
/ 01 декабря 2018

Вот подходящий ответ .Позвольте мне привести пример с прослушивателями.

Слушатели:

Предположим, есть класс, который извлекает данные в фоновом режиме, 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 выведет данные на консоль).

0 голосов
/ 01 декабря 2018

Интерфейсы не имеют реализации, и для их использования у нас есть два варианта:

  1. Класс, который их реализует
  2. Анонимный класс

И рассмотримэтот код:

interface TestInterface {
    void doSomething();
}

class TestClass{
    private TestInterface ti;
    public TestClass(TestInterface ti){
        this.ti = ti;
    }

    public void testActionMethod(){
        ti.doSomething();
        //some other codes
    }
}

class OurOwnLauncherApp{
    public static void main(String[] args) {
        TestClass tc = new TestClass(new TestInterface() {
            @Override
            public void doSomething() {
                System.out.println("Hi!");
            }
        });

        tc.testActionMethod();

        TestClass tc2 = new TestClass(new TestInterface() {
            @Override
            public void doSomething() {
                System.out.println("Bye!");
            }
        });

        tc2.testActionMethod();
    }
}

Здесь у нас есть:

  1. Интерфейс (точно так же, как вы просили)
  2. Класс функций, использующий этот интерфейс
  3. Приложение где-то, чего мы не знаем (может быть, ваше приложение для телефона, может быть приложение для телефона ваших друзей и т. Д.)

Что делает этот код, он предоставляет анонимный класс (который реализует TestInterface) к testActionMethod и с вызовом doSomething метода внутри testActionMethod , мы инвертируем обратный вызов к нашему собственному методу. , поэтому вы будетеувидеть этот результат:

Привет!

Пока!

Это упрощенная версия интерфейсов слушателя и принцип их работы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...