onResume中的视图为null

时间:2017-01-19 15:43:30

标签: android android-activity android-view android-lifecycle

我在onCreate初始化视图,有时在最小化应用后,某些用户的视图为null。我无法重现此错误。 GuiReceiver是更新活动视图的接收者。

这是我的简化代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.player_activity);
    tvTitle = (TextView) findViewById(R.id.title);
}

@Override
protected void onResume() {
    super.onResume();

    if (tvTitle != null)
        FirebaseCrash.log("onResume - tvTitle != null");
    else
        FirebaseCrash.log("onResume - tvTitle == null");

    IntentFilter filter = new IntentFilter();
    filter.addAction(CommonConstatns.GUI_UPDATE_ACTION);

    if (receiver == null) {
        receiver = new GuiReceiver();
        receiver.setPlayerActivity(this);
    }
}    

@Override
protected void onPause() {
    super.onPause();
    if (receiver != null) {
        unregisterReceiver(receiver);
        FirebaseCrash.log("GUIReceiver unregistered");
    }
}
<activity
    android:name=".activity.PlayerActivity"
    android:launchMode="singleTask"
    android:screenOrientation="userPortrait" />

3 个答案:

答案 0 :(得分:1)

您的应用程序的进程可以随时被系统杀死,并且不保证调用onDestroy。这可能是某些用户出现问题的原因。您可以通过为要声明的内存打开足够的应用程序并将系统杀死的应用程序进程来重现它。 您可以尝试将实例保存在onPause中并在onResume中恢复它。 这只是一个函数调用,可以放入两种方法。

答案 1 :(得分:1)

我从未遇到过这样的问题,但考虑到@Volodymyr Khodonovych和@jdesesquelles所写的建议,你可以稍微改进一下代码。您可以检查ContentView方法中是否设置了onResume()。您可以按照此处描述的方式获取其价值:https://stackoverflow.com/a/8817003/1150795。接下来,您可以检查它是否与null不同。如果它是null,则意味着它未设置,Android会杀死您的应用,您可以尝试以与{{1}中相同的方式为此活动设置它和所有视图},但这次是onCreate()方法。我不知道它是否是最好和最有效的解决方案。也许它只发生在资源有限的特定设备上,但我试着在开始时这样做。至少你可以为改进你的应用程序提供某种起点。

答案 2 :(得分:1)

除非将tvTitle声明为类的实例变量,否则我将以下代码行移动到onResume方法中:

   #mainmenu .img1{
       background: url('./images/icon/newicons/finance_icon.png') no-repeat top left;
       padding: 2px 0 0 25px;
    }

    #mainmenu .img2{
       background: url('./images/icon/newicons/asset_icon.png') no-repeat top left;
       padding: 2px 0 0 25px;
    }
     And so on...


    <div id="mainmenu">

            <ul class="navigationMenu" style="margin-left: 2.3em">
                <li class="img1">
                    <a class="home" (click)="getNewQuoteFinance()" >
                            Finance<!--<span>Finance</span>-->
                    </a>
                </li>

                <li class="img2">
                    <a class="about" (click)="getNewQuoteAsset()">
                            Asset <!--<span>Asset</span>-->
                    </a>
                </li>
    And so on ...
            </ul>
        </div>