0

javascriptメソッドを呼び出すために、webviewからJavascriptInterfaceメソッドを呼び出しています。問題は、メソッドが結果値を取得する前に値を返すことです。では、UIスレッドからJavaScriptメソッドが実行されるまでreturnステートメントを待機させるにはどうすればよいですか。

Javascriptインターフェース

public class CordovaJSInterface {
        Context cxt;
        String returnValueFromJS="";

        CordovaJSInterface(Context cxt){
            this.cxt = cxt;
        }
        public void setReturnValueFromJS(String valueFromJS){
            this.returnValueFromJS = valueFromJS;
        }
        @JavascriptInterface
        public String performClick()
          {

            /*MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mainView.loadUrl("javascript:" + "getLocation()" + ";");
                }

            });*/
            mainView.post(new Runnable() {
                @Override
                public void run() {
                    mainView.loadUrl("javascript:" + "getLocation()" + ";");
                }
            });
            /**PROBLEM : Method returns variable returnValueFromJS 
             * before it is updated by  getLocation() javascript method..
             **/

            return returnValueFromJS;
    }

だから私は performClick() が最初にUIスレッドを完了させ、次に値を返すようにしたい.

4

2 に答える 2

0

最初にインターフェースを作成します:

interface CallBack {
    void click(String returnValueFromJS);
}

これがアクティビティであると仮定し、ここで作成したインターフェイスを実装します。

public class FirstClass extends Activity implements CallBack {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView();
    //calling cordovainterface
    new CordovaJSInterface(this).performClick(); // now control goes to perform click of cordovaJSInterface
    //cut remaining code from here and paste it in click method
}

@Override
public void click(String returnValueFromJS) {
    //code after calling cordavajsinterface should be here
    }
}

そして、これは cordovaJSinterface です:

public class CordovaJSInterface {
Context cxt;
String returnValueFromJS = "";

CordovaJSInterface(Context cxt) {
    this.cxt = cxt;
}

public void setReturnValueFromJS(String valueFromJS) {
    this.returnValueFromJS = valueFromJS;
}

@JavascriptInterface
public void performClick() {

        /*MainActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mainView.loadUrl("javascript:" + "getLocation()" + ";");
            }

        });*/
    mainView.post(new Runnable() {
        @Override
        public void run() {
            mainView.loadUrl("javascript:" + "getLocation()" + ";");
            ctx.click(returnValueFromJS);
        }
    });
    /**PROBLEM : Method returns variable returnValueFromJS
     * before it is updated by  getLocation() javascript method..
     **/

    }
}

したがって、 を呼び出すとctx.click(returnValueFromJS);、コントロールはアクティビティのクリック メソッドに移動します。残りは好きなようにします。

于 2015-11-25T09:00:28.770 に答える
0

メソッドを使用してこれを実現できるかもしれませんThread.joinが、その場合は、基盤となる OS のスケジューリング方法論に依存し、それが本当に公平であると期待する必要があります。

しかし、それは私にとって正しい方法ではないようです (つまり、UI スレッドを待つということです)。UI スレッドは貪欲です。現在の js スレッドの優先順位を上げて、より多くの CPU スライスを取得できるかどうかはわかりません。

于 2016-11-07T18:45:20.210 に答える