0

以下のコードで私が間違っていることを誰かに説明してもらえますか?

executeJavascript メソッドを使用して一連のコマンドを Webview に送信しています。各コマンドをループしてから、次のコマンドが実行されるまで任意の時間待機します。

これを実行すると実際に何が起こるかというと、ループで一時停止するたびにアプリケーションがハングし、ループが完了するとすべての JavaScript アクションが一度に発生します。私のexecuteJavascriptをRunlaterクラスにラップすることで、すべてがアプリケーションスレッドとうまく同期されると思いました...

私はぐるぐる回っているように見えるので、助け/指示をいただければ幸いです、ありがとう。

以下を含む 3 つのクラス A: Main.class を設定しました。

 ...scene.setOnKeyPressed(event -> {
        switch (event.getCode()) {
            case SPACE:
                scriptRunner.run();
            case SHIFT:

B: 以下を含む ScriptRunner.class:

public class ScriptRunner extends Task<Void> {

@Override
protected Void call() throws Exception {

    printOut("Running Test");
    try (InputStream fileInputStream = new FileInputStream("test.txt");
         InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, Charset.forName("UTF-8"));
         BufferedReader bufferedReader = new BufferedReader(inputStreamReader);) {
        String getCurrentLine;
        StepRunner stepRunner = new StepRunner();

        while ((getCurrentLine = bufferedReader.readLine()) != null) {
            final String currentLine = getCurrentLine;
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    stepRunner.runStep(currentLine);
                }
            });
            Thread.sleep(3000);
        }

        printOut("Test finished");
        bufferedReader.close();
    } catch (
            IOException e) {
        e.printStackTrace();
    }
    return null;
}

C: 以下を含む StepRunner.class:

public class StepRunner extends Task<Void> {
private String currentCommand;

public StepRunner (String currentCommand){
    this.currentCommand = currentCommand;
}

@Override
protected Void call() throws Exception {
    printOut("Got Here with " + currentCommand);
    WebEngine.executeJavascript(currentCommand);
    return null;
}

}

4

1 に答える 1

0

スレッドで ScriptRunner クラスを拡張してみてください

public class ScriptRunner extends Thread {

        @Override
        public void run() {
            printOut("Running Test");
            try (InputStream fileInputStream = new FileInputStream("test.txt");
                 InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, Charset.forName("UTF-8"));
                 BufferedReader bufferedReader = new BufferedReader(inputStreamReader);) {
                String getCurrentLine;
                StepRunner stepRunner = new StepRunner();

                while ((getCurrentLine = bufferedReader.readLine()) != null) {
                    final String currentLine = getCurrentLine;
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            stepRunner.runStep(currentLine);
                        }
                    });
                    Thread.sleep(3000);
                }

                printOut("Test finished");
                bufferedReader.close();
            } catch (
                    IOException e) {
                e.printStackTrace();
            }
        }
}

それから電話する

Thread scriptRunner = new Thread(new ScriptRunner());
scriptRunner.run();

Thread.sleep(3000);問題は、アプリがハングすることだと思い ます。プロセスはスレッドで実行する必要があります。

于 2016-09-29T07:33:08.473 に答える