私が取り組んでいるプロジェクトでは、この特定のメソッドを別のスレッドから呼び出す必要があることをユーザーに警告するカスタム注釈を付けたいと思います。私はそれを@ThreadNeeded
と呼びました。そして、呼び出されたメソッドがメインスレッド上にあれば、コンパイラに警告するという効果を得たいと思います。どうすればこれを達成できますか?私は注釈に関する多くのガイドを見てきましたが、実際に注釈でElementType
をマークする以外には、それらを使用する方法はありません。ここで私はここで、これまでJavaアノテーションを便利にする方法
/**
* 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);
}
}
コンパイラは、このコードが実行されるスレッドを知る手段を持っていません。コンパイル時にあなたが望むことをすることはできません。実行時には、AOPを使用して@ThreadNeededによって注釈が付けられたメソッドをインターセプトし、必要な処理を行うことができます。別のスレッドでこのコードを実行する必要がある場合は、別のスレッドとして記述してください。 – Andre
注釈はこれを行う正しい方法ではありません。あなたのメソッドにjavadocを書いて、実行可能なスレッドと実行していないスレッドを明確に説明してください。例については、[EventQueue.invokeAndWait](http://docs.oracle.com/javase/8/docs/api/java/awt/EventQueue.html#invokeAndWait-java.lang.Runnable-)および[GraphicsContext]( http://docs.oracle.com/javase/8/javafx/api/javafx/scene/canvas/GraphicsContext.html)。 – VGR