我有以下3款类,请看一下:
main.java:
package com.tsc.sendit.worker;
public class Main {
public static void main(String[] args) {
new Thread(new Loader()).start();
}
}
加载器。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:你能让它自动工作吗?
因此,在errorMsg=“abc”
行后面,您可能需要NotifyListener();
,并且您的NotifyListener
实现需要一个空保护:
if (onExceptionChangeListener != null) onExceptionChangeListener.onExceptionChanged(errorMsg);
或者更好的做法是创建一个方法updateErrorMsg(String msg)
,它既更新errorMsg,又通知侦听器如果它不为空。