Android NullPointerException:createProgressDialog
从Crashlytics获取Android版本10的下一个错误: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.&
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
}