Android Kotlin вызывает функцию в другой деятельности - PullRequest
0 голосов
/ 12 июня 2018

Я вызываю функцию MainActivity в другой Activity, приложение закрывается и показывает ошибку, как показано ниже, помогите решить эту проблему.

Функция MainActivity:

fun checkInternet():Boolean {
    val cm = baseContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val networkInfo = cm.activeNetworkInfo
    if (networkInfo != null && networkInfo.isConnected) {

        alertPopUp("internet ok", "")
        return true
    }
    else {
        val title = getString(R.string.No_Internet)
        val message = getString(R.string.need_internet_for_service)
        alertPopUp(title, message)

        return false
    }

}

Вызовите эту функцию в другой операции:

var internetStatus:Boolean = MainActivity().checkInternet()

Сообщение об ошибке:

Причина: java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.Object android.content.Context.getSystemService (java.lang.String)' для ссылки на пустой объект по адресу com.gph.qpon.MainActivity.checkInternet (MainActivity.kt.: 148) at com.gph.qpon.qponClickedActivity.onCreate (qponClickedActivity.kt: 32)

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Во-первых, не создавать действия непосредственно конструктором .Активность имеет свой жизненный цикл, и это ОС, которая управляет им.Единственный правильный способ инициализации Activity - это использование Intent (но я думаю, что это не то, что вы хотите здесь сделать).

Кроме того, не пытайтесь сохранять активность в любом поле (это приводит к утечкам памяти).Если бы я предложил решение, я бы предложил использовать функцию расширения (потому что вы можете проверить соединение в любом классе Context, а не только в этом):

fun Context.checkInternet() {
   /* your code here, to use context use this */
   val cm = this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
   /* some code here */
}

Когда вы объявляете эту функцию, вы можете использовать еев любом классе контекста (например, Activity, Fragment и т. д. - они являются подтипами контекста).Теперь, как его использовать?

class MyActivity(): Activity() {
    fun foo() {
        this.checkInternet()
    }
} 
0 голосов
/ 12 июня 2018

Я бы предпочел извлечь всю логику для другого вспомогательного или служебного класса.Это большая ошибка, если вы собираетесь использовать это в своей деятельности.Довольно красивым решением может быть использование ConnectivityUtils служебного класса, например, известного iosched проекта, имеющего , просто передавая ему контекст приложения:

/**
 * Utility methods for dealing with connectivity
 */
object ConnectivityUtils {
  fun isConnected(context: Context): Boolean {
    val connectivityManager = context.applicationContext.getSystemService(
        Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val activeNetworkInfo = connectivityManager.activeNetworkInfo
    return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting
  }
}

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

ConnectivityUtils.isConnected(this)
0 голосов
/ 12 июня 2018

Либо у вас должен быть контекст MainActivity вместо создания нового, либо вы также можете передать контекст в свой метод checkInternet (), чтобы он мог получить контекст в другой Activity.Я изменил код ниже.

companion object {
    fun checkInternet(context: Context):Boolean {
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo = cm.activeNetworkInfo
        if (networkInfo != null && networkInfo.isConnected) {

            // alertPopUp("internet ok", "")
            return true
        }
        else {
            val title = "no Internet"
            val message = "Need Internet Service"
            // alertPopUp(title, message)

            return false
        }

    }
}

В приведенном выше коде я заменил baseContext на контекст, который я передал в конструкторе метода.Также из другого действия, из которого вызывается checkInternet, я отправил контекст этого действия.Код для этого ниже.

MainActivity.checkInternet(this)

Надеюсь, что поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...