Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.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接口函数在ajax回调中不起作用_Javascript_Android - Fatal编程技术网

Android Javascript接口函数在ajax回调中不起作用

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(

我有一个Android的webView应用程序。我已经定义了javascript接口
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”)
,看看会发生什么。