【发布时间】:2020-10-13 14:51:46
【问题描述】:
我有以下3个班,请看看:
Main.java:
package com.tsc.sendit.worker;
public class Main {
public static void main(String[] args) {
new Thread(new Loader()).start();
}
}
Loader.java
package com.tsc.sendit.worker;
import java.io.File;
public class Loader implements Runnable,Divider.OnExceptionChangeListener {
private Divider divider;
public Loader(){
divider = Divider.getInstance();
// register listener
divider.setOnExceptionChangeListener(this);
}
@Override
public void run() {
// a random fileName (it doesn't exist)
divider.setFile(new File("f:\\licenses.txt"));
}
@Override
public void onExceptionChanged(String errorMsg) {
System.out.println(errorMsg);
}
}
Divider.java
package com.tsc.sendit.worker;
import java.io.File;
import java.io.FileNotFoundException;
public class Divider {
private static Divider divider;
private String errorMsg;
private OnExceptionChangeListener onExceptionChangeListener;
private Divider() {}
public static Divider getInstance() {
if(divider==null)
divider = new Divider();
return divider;
}
public void setOnExceptionChangeListener(OnExceptionChangeListener onExceptionChangeListener) {
this.onExceptionChangeListener = onExceptionChangeListener;
if(errorMsg!=null) {
notifyListener();
}
}
private void notifyListener() {
onExceptionChangeListener.onExceptionChanged(errorMsg);
}
public void setFile(File file) {
startDividing();
}
private void startDividing() {
try {
throw new FileNotFoundException();
} catch (FileNotFoundException e) {
errorMsg = "abc";
}
}
interface OnExceptionChangeListener {
void onExceptionChanged(String errorMsg);
}
}
我什至调试了这段代码,这使我得出结论,尽管 errorMsg 发生了变化,但自定义侦听器不起作用。 我按照这里提到的方法:how-to-create-custom-listeners-in-java
(尽管那里的代码有效)
请给我一个解决方案。 提前致谢。
【问题讨论】:
-
只有在调用
setOnExceptionChangeListener时才会调用notifyListener,而不是在设置errorMsg时调用
标签: java