View.getContext返回null,为什么?

时间:2015-09-08 13:35:37

标签: android android-view android-lifecycle

我使用带有 javascript界面​​的WebView,有时当我在webView上调用loadUrl时,mWebView.getContext()会返回null

  1. 视图如何没有上下文?为什么?
  2. 是否仍在使用或可重复使用视图whitout上下文?
  3. 当我的观点没有背景时,我该怎么办?
  4. 最重要的,如果视图没有上下文,那么mWebView.post(new Runnable() { ...会被执行吗?
  5. 此代码是否相关?

    if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
        mWebView.loadUrl("javascript:...");
    } else {
        mWebView.post(new Runnable() {
            public void run() {
                mWebView.loadUrl("javascript:...");
            }
        });
    }
    

1 个答案:

答案 0 :(得分:11)

视图的空上下文的两个常见原因:

  • 您正在尝试在异步(处理程序,网络调用)调用的回调中获取上下文,但由于用户的另一个操作(例如:已按下),活动/片段已消失。因此视图已分离,不再具有上下文。

  • 您的某处存在内存泄漏,并且您的活动和视图层次结构有两个或更多实例。然后,在您不再引用的实例中发生了某些事情,但视图已失去与其上下文的链接。

关于处理程序。 我不确定视图是否有自己的处理程序,或者如果它使用它附加的Activity的处理程序,你可能必须阅读源代码才能找到答案。然而问题并不是真正相关:如果视图没有上下文,则会出现更大的问题:它不在屏幕上。

关于5中的代码是否相关,您需要回答这些问题:为什么不知道您的代码在哪个线程上运行?

当你知道自己在哪个线程上,并且如果你不在主线程上是有意义的话,那么使用处理程序是在main上执行代码的有效方法。以及Activity.runOnUiThread()

请记住,Handler的生命周期与活动无关。因此,当活动/片段暂停时,您应该清除消息队列和runnables