我想要一个HTML/javascript
应用程序,在a中运行WebView
以进行AJAX
由Java
代码处理的调用.
理想的做法是拦截调用(简单,只是使用shouldOverrideUrlLoading()
)并"返回"一些数据.
但是,WebView
除了使用javascript
函数调用函数之外,我找不到"返回"响应的方法loadUrl()
.
这对我不起作用,因为该HTML/javascript
应用程序是我无法控制的插入式应用程序.就HTML/javascript应用程序而言,它只是进行AJAX
调用并接收一些数据.
有什么想法吗?
大家好消息:使用API级别11,他们将shouldInterceptRequest
方法放入WebViewClient
类中.它还触发了WebView
触发器内的应用程序请求.您可以按如下方式覆盖它:
@Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (magicallyMatch(url)) return new WebResourceResponse("application/json", "utf-8", magicallyGetSomeInputStream()); return null; }
来自Android参考:
public WebResourceResponse shouldInterceptRequest(WebView视图,String url)
自:API等级11
通知主机应用程序资源请求并允许应用程序返回数据.如果返回值为null,
WebView
则将继续像往常一样加载资源.否则,将使用返回响应和数据.注意:此方法由网络线程调用,因此客户端在访问私有数据时应谨慎.参数
view
该WebView
所请求的资源.
url
资源的原始网址.返回
A
WebResourceResponse
包含响应信息,如果WebView
应该加载资源本身,则为null .
另请检查WebResourceResponse.
希望这可以帮助.
您可以使用JavascriptInterface拦截AJAX调用以及JQuery方法,ajaxStart
并ajaxComplete
采用以下方式:
// our JavascriptInterface public class AjaxHandler { private static final String TAG = "AjaxHandler"; private final Context context; public AjaxHandler(Context context) { this.context = context; } public void ajaxBegin() { Log.w(TAG, "AJAX Begin"); Toast.makeText(context, "AJAX Begin", Toast.LENGTH_SHORT).show(); } public void ajaxDone() { Log.w(TAG, "AJAX Done"); Toast.makeText(context, "AJAX Done", Toast.LENGTH_SHORT).show(); } }
以下是如何AjaxHandler
使用Activity
:
public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private WebView webView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // get web view webView = (WebView) findViewById(R.id.web); // configure web view final WebSettings webSettings = webView.getSettings(); webSettings.setBuiltInZoomControls(true); webSettings.setJavaScriptEnabled(true); webView.loadUrl("http://foo.com"); // add javascript interface webView.addJavascriptInterface(new AjaxHandler(this), "ajaxHandler"); // override onPageFinished method of WebViewClient to handle AJAX calls webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); view.loadUrl("javascript:$(document).ajaxStart(function (event, request, settings) { " + "ajaxHandler.ajaxBegin(); " + // Event called when an AJAX call begins "});"); view.loadUrl("javascript:$(document).ajaxComplete(function (event, request, settings) { " + "ajaxHandler.ajaxDone(); " + // Event called when an AJAX call ends "});"); }); } }
主要想法是从这里采取并提出一些调整.
虽然提交答案有点迟,但希望这对其他人也有帮助!