如何在android中等待来自javascript的返回值并继续

时间:2016-06-09 10:27:28

标签: javascript android

我只是一个星期前学习Android的人,对某些人来说可能是微不足道的,但这对我来说很重要,因为我是新手。我搜索了很多,无法找到一个直截了当的问题或解决方案。所以,我不想花太多时间在混淆和发布我的问题。

我的应用程序中有一个webview,它会加载一个网页。我在webview下面放了一个“Generate”按钮,并在该按钮的onclick中调用该网页中的JS函数“saveData()”。此功能需要几秒钟才能执行,并根据用户的网络连接速度返回响应。然后,我显示“复制”按钮来复制返回值。

    generate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {               
            generate.setVisibility(View.GONE);  
            copy.setVisibility(View.VISIBLE);   
            webView.loadUrl("javascript:alert(saveData)"); // this function needs few seconds.
            }
    });     

我正在捕获JS函数的返回值,如下所示,并设置字符串“JsVal”的值

    String JsVal;   
    public String getJsVal() {
        return jsVal;
    }

    public void setJsVal(String jsVal) {
        this.jsVal = jsVal;
    }

    webView.setWebChromeClient(new WebChromeClient() {
        @Override
        public boolean onJsAlert(WebView view, String url, String message,JsResult result) {
            Log.d("LogTag from js call method", message);
            setJsVal(message);
            result.confirm();
            return true;
        }
    });     

此处,复制按钮代码正在将文本复制以粘贴到某处,

    copy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {   
            Toast.makeText(getApplicationContext(), " Copied", Toast.LENGTH_SHORT).show();                  
            pb.setVisibility(View.GONE);
            ClipboardManager myClipboard;
            myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
            ClipData myClip;
            myClip = ClipData.newPlainText("text", tVal);
            myClipboard.setPrimaryClip(myClip);                 
        }
    });

问题是,如果我点击生成按钮,立即可以使用复制按钮。如果我立即点击复制按钮并粘贴到笔记应用程序中,则显示为null。如果我在2-3次之后复制它的非空。

我希望在JS返回值分配给String变量“JsVal”之后显示复制按钮,直到我不需要显示任何内容。

如何做到这一点,

4 个答案:

答案 0 :(得分:1)

尝试以下方法:

webView.setWebViewClient(new WebViewClient() {

   @Override
   public void onPageFinished(WebView view, String url) {
        copy.setVisibility(View.VISIBLE); 
   }
});

generate.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {               
        generate.setVisibility(View.GONE);
        webView.loadUrl("javascript:alert(saveData)"); // this function needs few seconds.
    }
});

答案 1 :(得分:0)

您需要通过WebViewClient扩展onPageFinished方法:

webView.setWebViewClient(new WebViewClient()
{
   @Override
   public void onPageFinished(WebView view, String url) {
        // Enable button
    }
});

答案 2 :(得分:0)

试试这个

 webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message,JsResult result) {
                Log.d("LogTag from js call method", message);
                setJsVal(message);
                result.confirm();
                return true;
            }

            @Override
            public void onProgressChanged(WebView view, int progress) {
                if (progress == 100) {
                    generate.setVisibility(View.GONE);
                    copy.setVisibility(View.VISIBLE);
                }
            }
        });

答案 3 :(得分:0)

你应该在按钮的onClick上使用AsyncTask。

您可以查看此文档https://developer.android.com/reference/android/os/AsyncTask.html

按如下方式更改您的代码,

generate.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {               
        generate.setVisibility(View.GONE);  
        //copy.setVisibility(View.VISIBLE);   
        webView.loadUrl("javascript:alert(saveData)"); // this function needs few seconds.

        AsyncTaskRunner runner = new AsyncTaskRunner();
        runner.execute();

        }
});     

此外,您需要添加以下代码以使AsyncTask正常工作。

private class AsyncTaskRunner extends AsyncTask<String, String, String> {
    @Override
    protected String doInBackground(String... params) {
        try {
            if (getVal() == null) {
                doInBackground(params);
            }           
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "success";
    }

    @Override
    protected void onPostExecute(String result) {
        copy.setVisibility(View.VISIBLE);
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onProgressUpdate(String... text) {
    }
}

这是您需要实施的解决方案,它应该按预期工作。