问题描述
最近代码里使用了webview,主要是使用webview load了远程的url。但是我从实现了javascript接口,调用javascript中方法刷新url时,发现刷新代码没有实际效果。示例代码如下:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); final WebView webView = (WebView)findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); webView.setWebChromeClient(new WebChromeClient()); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); javascr = new AndroidJavascript(this, webView); webView.addJavascriptInterface(javascr, "AndroidFunction"); webView.loadUrl("file:///android_asset/www/index.html"); }AndroidJavascript.java
public class AndroidJavascript { Context cont; WebView webView; AndroidJavascript(Context c, WebView w) { cont = c; webView = w; } // function called in the javascript by AndroidFunction.test(); public void test() { webView.loadUrl("javascript:helloBack()"); } }
问题解决
JavaScript接口中方法是在后台线程中执行,并不是在主线程中执行。但是,所有跟Android UI相关的方法都需要在主UI线程中进行调用。因此,这里需要使用post方法,将load url操作转移到主线程中,示例代码如下:
public void test() { webView.post(new Runnable() { public void run() { webView.loadUrl("javascript:helloBack()"); } }); }这可以将任务放到主UI线程中去执行。