0

次のことを行うバックグラウンド サービスを実行する Android アプリケーションを作成しました。

1) UDP サーバーに 100 個のパケットを送信するように依頼します。

2) while(true) ループでパケットを受信

3) setSoTimeout を使用して、受信が 5 分後にタイムアウトし、ループから抜けます。

以上の動作を 2 分ごとに繰り返します。電話が PC に接続されている場合、アプリケーションは完全に正常に動作し、すべてのステップが adb logcat を使用して監視されますが、電話が PC から切断されると、アプリケーションは動作を停止します。各ステップをファイルに記録すると、最後のステップが受信ステップであり、その後ソケットがタイムアウトしないことが示されます。考えられる理由は何ですか?意図したタスクを一定の間隔で実行できる他のアプローチはありますか? これは、サービスから開始されるスレッドの実行関数です。

   public void downlink() 
{
    String path = extStorageDirectory + "/" + appFolder + "/REP_DT_" + Long.toString(System.currentTimeMillis()) + ".txt";
    File file = new File(path);
    if(!file.exists())
    try 
    {
        file.createNewFile();
    }
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String p = extStorageDirectory + "/Goonj/logtput.txt";
    try {
        DatagramSocket clientSocket = new DatagramSocket();
        try {
            FileWriter fw = new FileWriter(path,true);
            fw.write("\n\n");
            fw.close();             
            clientSocket.setSoTimeout(120000);
            InetAddress IPAddress = InetAddress.getByName(IP);
            long id = System.currentTimeMillis();      
            byte[] sendData = createMessage(id,0,1400,150);     
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9010);
            clientSocket.send(sendPacket);      
            byte[] receiveData = new byte[10240];
            boolean flag = true;
            while(flag)//for(int i=0; i<100; i++)
            {      
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
                writeToLog(p,"START");
                clientSocket.receive(receivePacket);
                writeToLog(p,"END");
                long time = System.currentTimeMillis();
                String data = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println(data);
                fw = new FileWriter(path,true);
                fw.write(Long.toString(getSeqno(data)) + " " + Long.toString(time) + "\n");
                fw.close();
            }                               
        }
        catch(SocketTimeoutException e)
        {
            writeToLog(p,"SOCKET EXCEPTION HAS BEEN CAUGHT!!!" + Long.toString(System.currentTimeMillis()));
            e.printStackTrace();
        }
        catch(IOException e)
        {
            writeToLog(p,"IO EXCEPTION HAS BEEN CAUGHT!!!" + Long.toString(System.currentTimeMillis()));
            e.printStackTrace();
        }
        clientSocket.close();
    }
    catch(SocketException e){}
    //fw.close();
}
4

0 に答える 0