0

このコードを使用して、2 つのデバイス間でデータを転送します。

public void run() {

        try {
            Socket s = new Socket(myIpAddress, SERVERPORT);

            // outgoing stream redirect to socket
            OutputStream out = s.getOutputStream();

            PrintWriter output = new PrintWriter(out);
            output.println("DLS");
            BufferedReader input = new BufferedReader(new InputStreamReader(
                    s.getInputStream()));

            // read line(s)
            String st = input.readLine();
            // . . .
            // Close connection
            s.close();

        } catch (UnknownHostException e) {
            run();
            e.printStackTrace();
        } catch (IOException e) {
            run();
            e.printStackTrace();
        }

    }

私の問題は、最初にサーバーを起動する必要があり、その後、接続を成功させるためにクライアントを起動できることです。

の中に

public void run()

と に入れrun()ましUnknownHostExceptionIOException。他のコードでは問題なく動作しますが、ここではStackOverFlowError. 有限数で再試行し、X 秒ごとにのみ試行するようにするにはどうすればよいですか?

run()ハンドルされていない例外を求めてThread.sleep(5000);叫んだので、私はこの方法を試しました。サービスを開始すると、アプリがフリーズします。

public void run() throws UnknownHostException, IOException {

        Socket s = new Socket(myIpAddress, SERVERPORT);

        // outgoing stream redirect to socket
        OutputStream out = s.getOutputStream();

        PrintWriter output = new PrintWriter(out);
        output.println("DLS");
        s.close();

    } 

@Override
public void onCreate() {
    for (int i = 0; i < 10; i++) {
        try {
            run();
            break; // no exception: break out of the loop.
        }
        catch (IOException e) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }
4

3 に答える 3

0

キャッチで run() を呼び出す前に、次のことができます-

Thread.sleep(1000); // 1000 milli second = 1 second

これにより、再度 run を呼び出す前に、スレッドが 1 秒間スリープ状態になります。また、これは不正な再帰呼び出しにつながり、エラーの出力を含むコード実行を続行するための十分なスペースがスタックに残っていないため、永遠に試行しないでください。3 秒間隔で最大 5 ~ 10 回試してあきらめたほうがよいかもしれません。

スタック オーバーフロー エラーは、実行を続行するための仮想メモリが残っていない場合に発生します。

createメソッドからrunを呼び出しているとします。

private static final int MAX_TRY = 5;

public void create(){

    for(int i = 0; i < MAX_TRY; i++){    
        if(run()){ // if run call returns true, then get out of the loop        
            break;        
        } else {           
           Thread.sleep(1000); // Wait for a second before next try       
        }    
    }
}


public boolean run() {    

    boolean isSuccessful = false;

    try {

        Socket s = new Socket(myIpAddress, SERVERPORT);

        // outgoing stream redirect to socket
        OutputStream out = s.getOutputStream();

        PrintWriter output = new PrintWriter(out);
        output.println("DLS");
        BufferedReader input = new BufferedReader(new InputStreamReader(
                s.getInputStream()));

        // read line(s)
        String st = input.readLine();
        // . . .

        isSuccessful = true;

    } catch (Exception e) {            
        e.printStackTrace();            
    } finally {
        s.close();
    }

    return isSuccessful;

}
于 2013-08-11T21:53:33.040 に答える
0

ループが必要なだけです(IMOは、再帰よりも理解しやすいです):

for (int i = 0; i < MAX_ATTEMPTS; i++) {
    try {
        run();
        break; // no exception: break out of the loop.
    }
    catch (UnknownHostException | IOException e) {
        Thread.sleep(DELAY_BETWEEN_ATTEMPTS_IN_MILLIS);
    }
}

run()もちろん、メソッド自体から例外をキャッチしてはなりません。

于 2013-08-11T21:57:48.047 に答える