0

ネットワーク上の別のデバイスからの UDP ブロードキャストについてネットワークをスキャンするサービス インテントを作成しています。デバイスが見つかると、メッセージをメイン アクティビティに送り返し、それからその処理を実行します。問題は、このスキャンに何らかのタイムアウトを設定する必要があることです。そのため、一定時間経過してもデバイスが見つからない場合は、メイン アクティビティにそれを伝えることができます。私の最初の考えは、カウントダウンタイマーを使用することでしたが、機能していません。ブロードキャストをスキャンするメソッドのコードは次のとおりです

public void getIP()
    {
        new CountDownTimer(5000, 1000){

            @Override
            public void onFinish() {
                // TODO Auto-generated method stub
                System.out.println("Timer Finished");

            }

            @Override
            public void onTick(long millisUntilFinished) {
                // TODO Auto-generated method stub

            }

        }.start();
        try {
            UDPSocket = new DatagramSocket(55555, InetAddress.getByName("255.255.255.255"));
            UDPSocket.setBroadcast(true);
            byte[] buf = new byte[512];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            while(shouldContinue){
                try {
                    UDPSocket.receive(packet);
                    InetAddress senderAddress = packet.getAddress();
                    String Sender = senderAddress.getHostAddress();

                    UDPSocket.close();
                    shouldContinue = false;

                    pingIP(Sender);


                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
            sendIPBack("device not found local");

        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

sendIPBack は、メイン アクティビティにメッセージを返す単なるメソッドです。onFinish および onTick メソッドが実行されない理由は何ですか?

ありがとう

4

2 に答える 2

1

だから私はここで問題を見つけました。カウントダウン タイマーが開始しないという問題は実際にはありませんでした。それは、スレッドをロックしていた UDP リスナーの同じスレッドで実行されていたためです。サービスまたはインテントサービスでカウントダウンタイマーを絶対に実行できます。これが将来誰かに役立つことを願っています。

于 2013-02-01T17:36:29.853 に答える
0

私が知る限り、これは IntentService がどのように機能するかにかかっています。基本的に、 IntentService を開始すると、必要な作業を実行するワーカー スレッドが作成され、自己終了します。

あなたのコードでは、 doWakefulWork が終了するとすぐに IntentService が終了します。その結果、CountDownTimer は IntentService と共に終了します。

このようなことをしたい場合は、IntentService ではなく通常の Service を使用する必要があります。

于 2015-01-17T10:51:06.237 に答える