Ссылка на интерфейс является нулевой, даже после инициализации, из-за чего я не могу отобразить снек-бар при изменении интернет-соединения - PullRequest
0 голосов
/ 19 апреля 2019

Я внедряю 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

иизвините за несоответствие, это мой первый вопрос здесь.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Измените это - класс NetworkChangeReceiver: BroadcastReceiver () {to-object NetworkChangeReceiver: BroadcastReceiver () {

и измените это - val networkChangeReceiver = NetworkChangeReceiver () на - val networkChangeReceiver = NetworkChangeReceiver

Причина:

Вы создаете новый экземпляр в каждом действии с этой строкой val networkChangeReceiver = NetworkChangeReceiver ()

и регистрируете только первое действие с использованием этого кода

val intentFilter = IntentFilter()
    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE")
    registerReceiver(networkChangeReceiver,intentFilter)

Решение: сделать вещательный приемник синглтоном, используя объектную клавиатуру.

0 голосов
/ 19 апреля 2019

это потому, что вы создаете новую ссылку на NetworkChangeReceiver каждый раз, когда регистрируете действие, и единственный получатель, который вы регистрируете для подключения, является первым.

...