Android Javascript接口函数在ajax回调中不起作用
我有一个Android的webView应用程序。我已经定义了javascript接口Android Javascript接口函数在ajax回调中不起作用,javascript,android,Javascript,Android,我有一个Android的webView应用程序。我已经定义了javascript接口myapp,我可以从网页上成功调用它。我正在用ajax函数测试接口,但是当我在ajax成功回调中调用函数时,什么都没有发生: 我的网页中的Javascript代码: function notif(t,v){ try { myapp.Logit("start"); // I can see this message in Logcat }catch(
myapp
,我可以从网页上成功调用它。我正在用ajax函数测试接口,但是当我在ajax成功回调中调用函数时,什么都没有发生:
我的网页中的Javascript代码:
function notif(t,v){
try {
myapp.Logit("start"); // I can see this message in Logcat
}catch(err){}
$.ajax({
method:"post",
url:"test.asp",
data:{t:t,v:v},
success:function(data){
alert("done"); // Alert works in webpage
try {
myapp.Logit("finish"); // Nothing happens in Logcat
}catch(err){}
}
})
}
这是Android应用程序中用于在logcat中记录事件的简单功能:
@JavascriptInterface
public void Logit(String message){
Log.i("message:",message);
}
如何将Java对象注入这个WebView 请确保您正在将Java对象注入WebView,如下所示。否则,您将无法在WebView中访问Java对象的方法 addJavascriptInterface(新的MyApp(),“MyApp”) 查看调试控制台中是否有任何错误也会有所帮助 下面是示例工作代码。希望这有帮助
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}
myWebView.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
System.out.println("Web View loaded");
}
});
Button loadBtn = (Button) findViewById(R.id.load_button);
loadBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String unencodedHtml =
"<!DOCTYPE html>\n" +
"<html>\n" +
" <head>\n" +
" <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js\"></script>\n" +
" <script>\n" +
" $(document).ready(function(){\n" +
" $(\"button\").click(function(){\n" +
" $.ajax({\n" +
" method:\"get\",\n" +
" url: \"https://my-json-server.typicode.com/typicode/demo/posts\", \n" +
" success: function(result){\n" +
" alert(\"done\"); \n" +
" try {\n" +
" MyApp.Logit(\"finish\"); // Nothing happens in Logcat\n" +
" }catch(err){}\n" +
" }});\n" +
" });\n" +
" });\n" +
" </script>\n" +
" </head>\n" +
" <body>\n" +
" <button>Get External Content</button>\n" +
" </body>\n" +
"</html>";
String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(),
Base64.NO_PADDING);
myWebView.loadData(encodedHtml, "text/html", "base64");
}
});
myWebView.addJavascriptInterface(new MyApp(), "MyApp");
}
}
class MyApp
{
@JavascriptInterface
public void Logit(String message){
Log.i("message:",message);
}
}
public类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
最终WebView myWebView=(WebView)findViewById(R.id.WebView);
WebSettings WebSettings=myWebView.getSettings();
setJavaScriptEnabled(true);
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.KITKAT){
if(0!=(getApplicationInfo().flags&ApplicationInfo.FLAG\u可调试))
{WebView.setWebContentsDebuggingEnabled(true);}
}
myWebView.setWebViewClient(新的WebViewClient(){
公共void onPageFinished(WebView视图,字符串url){
System.out.println(“加载的Web视图”);
}
});
按钮loadBtn=(按钮)findviewbyd(R.id.load\u按钮);
loadBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
字符串未编码DHTML=
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“$(文档).ready(函数(){\n”+
“$(\”按钮“)。单击(函数(){\n”+
“$.ajax({\n”+
方法:\“获取\”,\n+
“url:\”https://my-json-server.typicode.com/typicode/demo/posts\“,\n”+
“成功:函数(结果){\n”+
“警报(\'done\”);\n”+
“请尝试{\n”+
“MyApp.Logit(\“finish\”);//在Logcat中不会发生任何事情\n”+
“}捕获(错误){}\n”+
“}});\n”+
“});\n”+
“});\n”+
“\n”+
“\n”+
“\n”+
“获取外部内容\n”+
“\n”+
"";
字符串encodedHtml=Base64.encodeToString(unencodedHtml.getBytes(),
Base64.无填充);
loadData(encodedHtml,“text/html”,“base64”);
}
});
addJavascriptInterface(新的MyApp(),“MyApp”);
}
}
类MyApp
{
@JavascriptInterface
公共void Logit(字符串消息){
Log.i(“消息:”,消息);
}
}
谢谢。我已经定义了与您的代码类似的界面,正如我所提到的,在main函数中调用myapp.Logit(“start”)
。但在回调函数中再次调用无效。唯一的区别是我的html文件在服务器上,我在webView中加载它。POST调用成功吗?请检查WebView调试控制台中是否有任何错误消息,并尝试直接从WebView调试控制台调用MyApp.Logit(“finish”)
,看看会发生什么。