Android Kotlin在其他活动中调用函数

时间:2018-06-12 12:48:44

标签: android function android-activity kotlin

我在其他Activity中调用了MainActivity的功能,关闭应用程序并显示如下错误,请帮助解决此问题。

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)'在null对象引用上       在com.gph.qpon.MainActivity.checkInternet(MainActivity.kt:148)       在com.gph.qpon.qponClickedActivity.onCreate(qponClickedActivity.kt:32)

3 个答案:

答案 0 :(得分:3)

我宁愿将所有逻辑提取到不同的帮助器或实用程序类。如果你要重复使用它,将它放在一个活动中是一个很大的错误。一个非常简洁的解决方案可能是拥有一个ConnectivityUtils实用程序类,就像着名的iosched project has一样,只需将应用程序上下文传递给它:

/**
 * 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)

答案 1 :(得分:0)

您应该拥有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)

希望有所帮助。

答案 2 :(得分:0)

首先,不要直接通过构造函数创建活动。 Activity有自己的生命周期,它是管理它的操作系统。初始化Activity的唯一正确方法是使用Intent(但我想这不是你想要做的)。

另外,不要试图将Activity保留在任何字段中(这会导致内存泄漏)。 如果我要提出一个解决方案,我会建议使用扩展函数(因为你可以检查任何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()
    }
}