我使用带有 javascript界面的WebView,有时当我在webView上调用loadUrl
时,mWebView.getContext()
会返回null
。
mWebView.post(new Runnable() { ...
会被执行吗?此代码是否相关?
if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
mWebView.loadUrl("javascript:...");
} else {
mWebView.post(new Runnable() {
public void run() {
mWebView.loadUrl("javascript:...");
}
});
}
答案 0 :(得分:11)
视图的空上下文的两个常见原因:
您正在尝试在异步(处理程序,网络调用)调用的回调中获取上下文,但由于用户的另一个操作(例如:已按下),活动/片段已消失。因此视图已分离,不再具有上下文。
您的某处存在内存泄漏,并且您的活动和视图层次结构有两个或更多实例。然后,在您不再引用的实例中发生了某些事情,但视图已失去与其上下文的链接。
关于处理程序。 我不确定视图是否有自己的处理程序,或者如果它使用它附加的Activity的处理程序,你可能必须阅读源代码才能找到答案。然而问题并不是真正相关:如果视图没有上下文,则会出现更大的问题:它不在屏幕上。
关于5中的代码是否相关,您需要回答这些问题:为什么不知道您的代码在哪个线程上运行?
当你知道自己在哪个线程上,并且如果你不在主线程上是有意义的话,那么使用处理程序是在main上执行代码的有效方法。以及Activity.runOnUiThread()
请记住,Handler的生命周期与活动无关。因此,当活动/片段暂停时,您应该清除消息队列和runnables