在我正在处理的项目中,我希望有一个自定义注释,警告用户应该从另一个线程调用此特定方法。我称之为@ThreadNeeded
,我希望实现让编译器在调用的方法在主线程上时警告用户的效果。我怎样才能做到这一点?我已经查看了许多关于注释的指南,但除了用注释标记ElementType
之外,它们都没有实际使用它们。这是我到目前为止注释的来源
/**
* An annotation that signifies that this method needs to be run inside a background thread.
*/
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface ThreadNeeded {
}
这是一个示例用法
@Nullable
@ThreadNeeded
public SonyCamera build(){
try {
send();
} catch (Exception ex){
Log.e(TAG, ex.getMessage(), ex);
return null;
}
return camera;
}
private void send() throws Exception {
final byte[] ssdpreqb = SSDP_REQUEST.getBytes();
DatagramSocket socket;
DatagramPacket recieve, packet;
socket = new DatagramSocket();
InetSocketAddress isad = new InetSocketAddress(SSDP_ADDRESS, SSDP_PORT);
packet = new DatagramPacket(ssdpreqb, ssdpreqb.length, isad);
socket.send(packet);
Thread.sleep(100);
socket.send(packet);
Thread.sleep(100);
socket.send(packet);
boolean searching = true;
byte[] array = new byte[1024];
while(searching) {
recieve = new DatagramPacket(array, array.length);
socket.setSoTimeout(SSDP_TIMEOUT);
socket.receive(recieve);
String replyMessage = new String(recieve.getData(), 0, recieve.getLength(), "UTF-8");
String ddusn = SSDPClient.findParamaterValue(replyMessage, "USN");
String location = SSDPClient.findParamaterValue(replyMessage, "LOCATION");
camera.location = location;
camera.usn = ddusn;
fetch(location);
}
}
答案 0 :(得分:1)
GUI Effect Checker可能会满足您的需求。以下内容取自its documentation:
最常见的GUI相关错误之一是无效的UI更新或无效的线程访问:直接从后台线程访问UI。
GUI效果检查器解决了这个问题。 GUI Effect Checker确保只有UI线程访问UI对象。这可以防止GUI错误,例如无效的UI更新和无效的线程访问。
程序员注释每个方法以指示是否:
在编译时,GUI效果检查器在以下情况下发出错误:
答案 1 :(得分:1)
为了在编译源代码时处理注释,您应该编写注释处理器并指示javac
使用它们。
以下是某种教程:https://www.javacodegeeks.com/2015/09/java-annotation-processors.html
虽然我不确定您是否可以在编译时检测到提到的线程问题。