我遇到了一个奇怪的问题,它只出现在特定设备上(或者至少在我测试我的应用程序的大约 10 个其他设备中不存在)。
有时,当应用程序应该显示一个进度对话框,然后显示一个包含消息的 Toast 时,它反而崩溃了;在 Play Console 上看,我看到了这个堆栈跟踪:
java.lang.RuntimeException:
at android.view.InputChannel.nativeReadFromParcel (Native Method)
at android.view.InputChannel.readFromParcel (InputChannel.java:148)
at android.view.IWindowSession$Stub$Proxy.addToDisplay (IWindowSession.java:796)
at android.view.ViewRootImpl.setView (ViewRootImpl.java:750)
at android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:298)
at android.view.WindowManagerImpl.addView (WindowManagerImpl.java:91)
at android.widget.Toast$TN.handleShow (Toast.java:732)
at android.widget.Toast$TN$1.run (Toast.java:631)
at android.os.Handler.handleCallback (Handler.java:739)
at android.os.Handler.dispatchMessage (Handler.java:95)
at android.os.Looper.loop (Looper.java:145)
at android.app.ActivityThread.main (ActivityThread.java:6939)
at java.lang.reflect.Method.invoke (Native Method)
at java.lang.reflect.Method.invoke (Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1199)
Run Code Online (Sandbox Code Playgroud)
进度条和 Toast 应该每 5 秒显示一次。
如您所见,一切都发生在 Android 内部(没有参考我的实际代码),但我相信以下是所涉及的代码片段。
这是显示进度条的地方:
public abstract class FragmentNetworkingBenderAsyncTask<I, O> extends BenderAsyncTask<I, O> {
@SuppressLint("StaticFieldLeak")
private …Run Code Online (Sandbox Code Playgroud) 查看 Fragment 生命周期(例如此处),Activity 似乎在发出任何其他回调之前附加到 Fragment(这是由onAttach()方法通知的)。
在我的由单个活动组成的应用程序中,第一个 Fragment 是从onCreate()Activity的方法中打开的(实际上它是在里面完成的最后一件事onCreate())。
目前,我正在onCreateView()回调中初始化我的所有图形元素,包括一些ArrayAdapter需要构造 Activity 的对象(如)的实例化,这是通过调用getActivity(). 我假设此时 Activity 肯定存在,因为该onAttach()方法已经被调用。
我注意到 IntelliJ 警告我getActivity()返回的可能性null,可能只是因为该方法被注释为@Nullable,所以我开始在网上搜索我的假设是否真的正确,现在我很困惑:getActivity()在内部调用是否真的安全onCreateView()? 为什么有一个方法被调用onActivityCreated()(我知道它现在已被弃用,但它肯定是有用途的)?
不幸的是,文档无助于理解这一点。