android - View.getContext 返回 null,为什么?

标签 android android-view android-lifecycle

我正在使用带有 javascript 接口(interface) 的 WebView,有时当我在 webView 上调用 loadUrl 时,mWebView.getContext() 返回

  1. View 怎么可能没有上下文?为什么?
  2. 没有上下文的 View 是否仍在使用或可重用?
  3. 当我的 View 没有上下文时我该怎么办?
  4. 最重要的,如果 View 没有上下文,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:...");
            }
        });
    }
    

最佳答案

View 空上下文的 2 个常见原因:

  • 您正尝试在异步(处理程序、网络调用)调用的回调中获取上下文,但由于用户的另一个操作(例如:按下), Activity/fragment 消失了。因此, View 是分离的并且不再有上下文。

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

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

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

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

请记住,处理程序的生命周期与 Activity 无关。因此,当您的 Activity/fragment 暂停时,您应该清除消息队列和可运行对象

关于android - View.getContext 返回 null,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32459297/

相关文章:

android - 在 Nexus (7.1.1) 上获取导航栏方向(左/右)

android - 有没有一种方法可以创建链接到您在市场上的应用程序的可扫描条形码?

android - 有没有办法在android中使用ObjectAnimator为View创建倾斜动画

android-layout - ViewBinding - 如何在 ViewBinding 中设置包含布局的可见性?

android - 应用程序的子类曾经被破坏过吗?

android - 为什么 Button 在 Android 中是它自己的类?

java - BACK 键未完成 Activity

Android - View.getResources() 和 View.getContext().getResources() 之间的区别

android - 使服务生命周期独立于 Activity

android - Android Activity 的进程被杀死后如何变为 "restored"?