View.getContext返回null,为什么?

3

我正在使用WebView和javascript接口,有时候当我在webView上调用loadUrl时,mWebView.getContext()会返回null。

  1. How can a view have no Context ? Why ?
  2. Is a view whitout context still used or reusable ?
  3. What should I do when my view did not have a context ?
  4. Most important, if the view has no context, will mWebView.post(new Runnable() { ... be executed ?
  5. Is this code relevant ?

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

2
如果发生这种情况,大多是因为托管小部件的Activity/Fragment正在关闭。 - Blackbelt
1个回答

11

一个视图上出现“null context”的两个常见原因:

  • 您试图在异步回调中(处理程序、网络调用)获取上下文,但由于用户的其他操作(例如:按下返回键),活动/片段已经消失。因此,视图被分离,并且不再具有上下文。

  • 您的某个地方存在内存泄漏,导致两个或多个您的Activity和视图层次结构的实例。然后,在您不再引用的实例中发生了某些事情,但视图已经失去了与其上下文的链接。

关于处理程序。我不确定视图是否有自己的处理程序,还是使用所附加到它的活动的处理程序,您可能需要阅读源代码才能找出答案。但是问题并不是真正相关的:如果视图没有上下文,您将面临更大的问题:它不在屏幕上。

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

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

只要记住,处理程序的生命周期与活动不相关。因此,当您的活动/片段暂停时,应清除消息和可运行项队列。


谢谢您的回答,能否检查一下第四和第五个问题? - Hugo Gresse
如果我想在webview中做某些事情,但是mWebView.getContext()返回null,那么片段会恢复,但动作不会触发,导致页面处于奇怪的状态。 - Hugo Gresse
如果您的视图没有显示出来,就是因为某些原因导致的。您需要寻找这个“某些原因”,然后Web视图就可以正常工作了。 - znat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接