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