Я внедряю BroadcastReceiver, чтобы отображать Snackbar при изменении интернет-соединения, поэтому я создал интерфейс и инициализировал его в 3 различных действиях для выполнения кода Snackbar при изменении интернет-соединения
Моя проблема заключается в том, что ссылка на интерфейс в2-е и 3-е действие пусто, но не равно нулю в 1-м занятии странно
я подумал, что проблема может заключаться в том, что я использую одну и ту же ссылку на интерфейс для всех трех действий (я был уверен, что это не такпроблема, но я думал, что что-то происходит, о чем я не знаю), поэтому я создал 3 разных ссылки, по одной на каждое действие, но это все равно не решило мою проблему
BroadcastReceiver код:
class NetworkChangeReceiver : BroadcastReceiver() {
private var firstActivityReference: InternetSnackbarInterface? = null
private var secondActivityReference: InternetSnackbarInterface? = null
private var thirdActivityReference: InternetSnackbarInterface? = null
fun registerFirstActivityInterface(snackbarInterface: InternetSnackbarInterface) {
this.firstActivityReference= snackbarInterface
}
fun registerSecondActivityInterface(snackbarInterface: InternetSnackbarInterface) {
this.secondActivityReference= snackbarInterface
}
fun registerThirdActivityInterface(snackbarInterface: InternetSnackbarInterface) {
this.thirdActivityReference= snackbarInterface
}
override fun onReceive(context: Context, intent: Intent?) {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetworkInfo = connectivityManager.activeNetworkInfo
val isConnected = activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting
if (isConnected){
firstActivityReference?.hideNoInternetSnackbar()
secondActivityReference?.hideNoInternetSnackbar()
thirdActivityReference?.hideNoInternetSnackbar()
}else{
firstActivityReference?.showNoInternetSnackbar("No internet connection")
secondActivityReference?.showNoInternetSnackbar("No internet connection")
thirdActivityReference?.showNoInternetSnackbar("No internet connection")
}
}
interface InternetSnackbarInterface {
fun showNoInternetSnackbar(message: String)
fun hideNoInternetSnackbar()
}
}
код, связанный с первым занятием:
class FirstActivity: AppCompatActivity(),NetworkChangeReceiver.InternetSnackbarInterface{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val networkChangeReceiver = NetworkChangeReceiver()
networkChangeReceiver.registerFirstActivityInterface(this)
val intentFilter = IntentFilter()
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE")
registerReceiver(networkChangeReceiver,intentFilter)
}
var internetSnackbar : Snackbar? =null
private fun showSnackbar(message : String,length : Int){
val parentLayout = findViewById<View>(android.R.id.content)
internetSnackbar = Snackbar.make(parentLayout, message, length)
internetSnackbar?.show()
}
override fun hideNoInternetSnackbar() {
internetSnackbar?.dismiss()
}
override fun showNoInternetSnackbar(message: String) {
showSnackbar(message, Snackbar.LENGTH_INDEFINITE)
}
}
код, связанный с вторым занятием:
class SecondActivity: AppCompatActivity(),NetworkChangeReceiver.InternetSnackbarInterface{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val networkChangeReceiver = NetworkChangeReceiver()
networkChangeReceiver.registerSecondActivityInterface(this)
}
var internetSnackbar : Snackbar? =null
private fun showSnackbar(message : String,length : Int){
val parentLayout = findViewById<View>(android.R.id.content)
internetSnackbar = Snackbar.make(parentLayout, message, length)
internetSnackbar?.show()
}
override fun hideNoInternetSnackbar() {
internetSnackbar?.dismiss()
}
override fun showNoInternetSnackbar(message: String) {
showSnackbar(message, Snackbar.LENGTH_INDEFINITE)
}
}
код, связанный с третьим занятием:
class ThirdActivity: AppCompatActivity(),NetworkChangeReceiver.InternetSnackbarInterface{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val networkChangeReceiver = NetworkChangeReceiver()
networkChangeReceiver.registerThirdActivityInterface(this)
}
var internetSnackbar : Snackbar? =null
private fun showSnackbar(message : String,length : Int){
val parentLayout = findViewById<View>(android.R.id.content)
internetSnackbar = Snackbar.make(parentLayout, message, length)
internetSnackbar?.show()
}
override fun hideNoInternetSnackbar() {
internetSnackbar?.dismiss()
}
override fun showNoInternetSnackbar(message: String) {
showSnackbar(message, Snackbar.LENGTH_INDEFINITE)
}
}
снекоторые отладки я обнаружил, что:
прямо, когда registerSecondActivityReference называется референциейне является нулевым, но сразу после этого он снова становится нулевым, и то же самое происходит с ThirdActivityReference, зная, что я никогда не назначу их снова равным нулю в любой части моего кода
, как ни странно, этого никогда не случится с firstActivityReference
иизвините за несоответствие, это мой первый вопрос здесь.