Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中等待javascript返回值并继续_Javascript_Android - Fatal编程技术网

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

如何在android中等待javascript返回值并继续,javascript,android,Javascript,Android,从一周前开始,我只是一个Android学习者,这对某些人来说可能是一件小事,但这对我来说是件大事,因为我是新来的。我搜索了很多,找不到一个直截了当的问题或解决方案。所以,我不想花太多时间在困惑和张贴我的问题在这里 我的应用程序中有一个webview,可以加载网页。我在webview下面放置了一个按钮“Generate”,并在该按钮的onclick中调用该web页面中的JS函数“saveData()”。此函数需要几秒钟来执行,并根据用户的网络连接速度返回其响应。然后,我显示“复制”按钮来复制返回值

从一周前开始,我只是一个Android学习者,这对某些人来说可能是一件小事,但这对我来说是件大事,因为我是新来的。我搜索了很多,找不到一个直截了当的问题或解决方案。所以,我不想花太多时间在困惑和张贴我的问题在这里

我的应用程序中有一个webview,可以加载网页。我在webview下面放置了一个按钮“Generate”,并在该按钮的onclick中调用该web页面中的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”的值

这里,复制按钮代码将文本复制粘贴到某个地方

    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);                 
        }
    });
问题是,如果单击“生成”按钮,立即复制按钮可用。如果我立即单击“复制”按钮并粘贴到notes应用程序中,它将显示null。如果我在2-3秒后复制,它不为空

我想在分配给字符串变量“JsVal”的JS返回值之后显示copy按钮,直到我不需要显示任何内容为止

如何执行此操作,请尝试以下操作:

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.
    }
});

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

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

 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);
                }
            }
        });

您应该在button的onClick中使用AsyncTask来完成它

你可以看看这个文档

按如下方式更改代码

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) {
    }
}
私有类AsyncTaskRunner扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
如果(getVal()==null){
doInBackground(params);
}           
}捕获(例外e){
e、 printStackTrace();
}
返回“成功”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
copy.setVisibility(View.VISIBLE);
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onProgressUpdate(字符串…文本){
}
}

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

Glitcher,谢谢您的回答。但是,我已经试过了,但是对于javascript加载来说,它不起作用。有没有其他方法可以用来保存?对不起,我不明白?你可以每秒测试tVal的内容,如果没有空,那么复制吗?是的,但是你可以试试吗?一旦值回来,谢谢玛丽,这就是我所期望的。很有魅力。我不确定这怎么行。如果我尝试类似的方法,结果会出现StackOverflow异常。有没有办法防止这种情况发生?
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) {
    }
}