Вот подходящий ответ. Позвольте мне привести вам пример о слушателях.
Слушатели:
Предположим, что есть класс, который извлекает данные в фоновом режиме, 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
выведет данные на консоль).
person
Themelis
schedule
01.12.2018