Android NullPointerException:createProgressDialog

Android NullPointerException:createProgressDialog,android,kotlin,android-fragments,nullpointerexception,progressdialog,Android,Kotlin,Android Fragments,Nullpointerexception,Progressdialog,从Crashlytics获取Android版本10的下一个错误: Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference at android.app.Dialog.&

从Crashlytics获取Android版本10的下一个错误:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
       at android.app.Dialog.<init>(Dialog.java:196)
       at android.app.ColorBaseAlertDialog.<init>(ColorBaseAlertDialog.java:33)
       at android.app.AlertDialog.<init>(AlertDialog.java:208)
       at android.app.AlertDialog.<init>(AlertDialog.java:204)
       at android.app.ProgressDialog.<init>(ProgressDialog.java:112)
       at com.sau.authenticator.widget.fragment.BaseFragment.createProgressDialog(BaseFragment.java:46)
       at com.sau.authenticator.widget.fragment.BaseFragment.showLoadProgress(BaseFragment.java:41)
       at com.sau.authenticator.widget.fragment.WebViewFragment$webViewClient$1.onPageStarted(WebViewFragment.java:69)
       at i6.c(i6.java:2)
       at Hn.handleMessage(Hn.java:145)
       at android.os.Handler.dispatchMessage(Handler.java:107)
       at android.os.Looper.loop(Looper.java:228)
       at android.app.ActivityThread.main(ActivityThread.java:7782)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)
以下是我的WebViewFragment的代码:

class WebViewFragment : BaseFragment() {

    private var url = ""
    private var title = ""

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            url = it.getString(KEY_URL, "")
            title = it.getString(KEY_TITLE, "")
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        activityComponents?.updateAppbar(
            title = title,
            backActionImageResId = R.drawable.ic_appbar_action_back
        )
        return inflater.inflate(R.layout.fragment_web_view, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        customWebView?.webViewClient = webViewClient
        customWebView?.loadUrl(url)
    }

    private val webViewClient = object : WebViewClient() {

        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
            super.onPageStarted(view, url, favicon)
            showLoadProgress()
        }

        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)
            dismissLoadProgress()
        }
    }

    companion object {
        const val KEY_URL = "KEY_URL"

        fun newBundle(url: String = "", title: String): Bundle {
            return Bundle().apply {
                putString(KEY_URL, url)
                putString(KEY_TITLE, title)
            }
        }
    }
}

我对
WebView
不太熟悉,但当
onPageStarted()
被调用时,您的用户似乎已经离开(或旋转了他的设备)。因此,您的
片段
onDestroyView()
可能已被调用,但您没有通知开始加载url的
Web视图。这就是为什么
activity
null
时会出现异常

因此,在
WebViewFragment
的生命周期回调中,请确保也通知
WebView

override fun onResume() {
    super.onResume()
    customWebView?.onResume()
}

override fun onPause() {
    super.onPause()
    customWebView?.onPause()
}

override fun onDestroyView() {
    super.onDestroyView()
    customWebView?.stopLoading() // this should prevent onPageStarted() from being called
}

这个错误似乎发生在您的片段被销毁视图时。我对此并不完全确定。您可以通过加载一个大的web页面进行复制,然后导航到另一个片段,以便执行WebViewFragment/onViewDestroyed。在onPageStarted和onPageFinished中打印日志。如果在销毁视图时看到它们被调用,这正是原因所在。此时,您只需检查生命周期状态即可显示或隐藏进度。

我不太明白使用WebView在片段中应该更改什么。我在问题中添加了片段代码。我用代码示例更新了答案。调用
stopLoading()
应该可以防止调用
onPageStarted()
,从而引发异常。不要忘记在
onViewCreated()
中初始化
customWebView
,我在您的codeThx中没有看到这个答案,但是您如何看待初始化?现在我有了'customWebView?.webViewClient=webViewClient customWebView?.loadUrl(url)`我希望在那里看到
customWebView=…
。我也找不到您在哪里声明
customWebView
override fun onResume() {
    super.onResume()
    customWebView?.onResume()
}

override fun onPause() {
    super.onPause()
    customWebView?.onPause()
}

override fun onDestroyView() {
    super.onDestroyView()
    customWebView?.stopLoading() // this should prevent onPageStarted() from being called
}