0

Я инициализирую представление в onCreate, а иногда после сведения к минимуму приложения вид null для некоторых пользователей. Я не могу воспроизвести эту ошибку. GuiReceiver - получатель, который обновляет виды активности.View is null in onResume

Вот мой упрощенный код:

@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" /> 
+1

Android может убить ваше приложение, если не хватает памяти. Затем, когда вы восстанавливаете приложение из последних приложений, он восстанавливает стек активности, но метод 'onCreate' не вызван –

ответ

1

Процесс вашего приложения может быть убит в любое время с помощью системы, без гарантии OnDestroy неоспоримым называется. Вероятно, это причина, по которой проблема возникает для некоторых пользователей. Возможно, вы сможете воспроизвести его, открыв достаточное количество приложений для требуемой памяти и процесс приложения, который будет убит системой. Вы можете попытаться сохранить свой экземпляр в onPause и восстановить его в onResume. Это просто вызов функции для ввода обоих методов.

1

Я никогда не сталкивался с такой проблемой, но с учетом предложений, написанных @Volodymyr Khodonovych и @jdesesquelles, вы можете немного улучшить код. Вы можете проверить, установлен ли ContentView в методе onResume(). Вы можете получить его значение описанным здесь образом: https://stackoverflow.com/a/8817003/1150795. Затем вы можете проверить, не отличается ли это от null. Если это null, значит, он не установлен, Android убил ваше приложение, и вы можете попробовать установить его и все представления для этого действия так же, как в onCreate(), но на этот раз в onResume() методе. Я не знаю, лучшее ли это решение. Возможно, это происходит только на определенных устройствах с ограниченными ресурсами, но я бы попытался пойти этим путем в начале. По крайней мере, у вас может быть какая-то отправная точка для решения проблемы улучшения вашего приложения.

1

Если tvTitle не объявлена ​​как переменная экземпляра класса, я бы переместить следующую строку кода в onResume метод:

tvTitle = (TextView) findViewById(R.id.title);