【问题标题】:Android - how to pass context parameter to a method?Android - 如何将上下文参数传递给方法?
【发布时间】:2015-01-21 20:04:06
【问题描述】:

我正在尝试为我女儿开发一个简单的应用程序,但我不是专业人士:)

我想知道如何将上下文传递给布尔方法?

我的问题是,当尝试合并下面的两个代码时

private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager 
     = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;}

public static boolean hasActiveInternetConnection(Context context) {
if (isNetworkAvailable(context)) {
    try {
        HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
        urlc.setRequestProperty("User-Agent", "Test");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(1500); 
        urlc.connect();
        return (urlc.getResponseCode() == 200);
    } catch (IOException e) {
        Log.e(LOG_TAG, "Error checking internet connection", e);
    }
} else {
    Log.d(LOG_TAG, "No network available!");
}
return false;}

我收到错误是因为我不知道如何传递 Context 参数。

【问题讨论】:

    标签: android parameters android-context


    【解决方案1】:

    你应该替换这个:

    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager 
             = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }
    

    有了这个:

    private boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivityManager 
              = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }
    

    【讨论】:

      【解决方案2】:

      是的,在 Android 中通常需要引用 Context。

      基本上,如果您查看Context class doc,您会看到,从它继承了 2 个非常重要的类:Application 和 Activity(包括其所有变体,如 FragmentActivity 等)。

      所以这项技术很简单:在任何需要上下文的地方,你都可以做其中之一

      • 将 Activity/Application 对象作为上下文传递

      • 使用 Singleton 模式来保留 Context 字段(通常使用自定义 Application 类,请参阅 getApplicationContext()

      关于您的代码:
      getSystemService() 实际上是 Context 类的一个方法,我猜你在 Activity 对象内部的某个地方调用它(因为 Activity 是 Context 子类)。所以没有理由在... if (isNetworkAvailable(context)) ...中传递Context对象,只要去掉这个参数,直到isNetworkAvailable()方法保留在Activity中。

      注意保持对上下文的强引用!

      【讨论】:

        【解决方案3】:
        private boolean isNetworkAvailable(Context ctx) {
        ConnectivityManager connectivityManager 
             = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;}
        

        【讨论】: