我在其他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)
答案 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()
}
}