2014-01-22 2 views
0

Мне было интересно, может ли кто-нибудь объяснить проблему, с которой я столкнулся. Ниже приведен сегмент кода, который я в настоящее время положить в каждом из моих классов, чтобы проверить, если Android сеть телефона доступна:Обнаружение сети андроида через внешний метод нестатического класса

private boolean isNetworkAvailable() { 

    ConnectivityManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo networkInfo = manager.getActiveNetworkInfo(); 

    boolean isAvailable = false; 

    if(networkInfo != null && networkInfo.isConnected()) { 
     isAvailable = true; 
    } 

    return isAvailable; 
} 

Это работает очень хорошо, когда размещена в нижней части каждого класса как частный метод, однако это не слишком сильно влияет на принцип DRY, поэтому я попытался поместить его во внешний класс под названием «appHelpers» и сделать его общедоступным, а затем просто вызвать класс appHelpers каждый раз, когда я хочу использовать метод :

public boolean isNetworkAvailable() { 
    ... 
} 

Теперь, если я пытаться вызвать метод непосредственно из своего класса, например, так:

if(appHelpers.isNetworkAvailable()) { 
    ... 
} 

Я получаю знакомый «Не могу сделать статическую ссылку на нестатический метод isNetworkAvailable() из типа appHelpers». Однако, если я попытаться сделать статический метод внутри appHelpers(), я получаю красную линию под «getSystemService (контекст ...) аспект этой линии:

ConnectivityManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

С отчетом об ошибках, как» Не удается сделать статическую ссылку к нестационарному методу getSystemService (String) из типа ContextWrapper ".

Я просто не могу понять, в чем проблема, и я не собираюсь решать проблему. Кто-нибудь знает об этом? Мои оценки заблаговременно.

ответ

1

Вам необходимо передать Контекст (из getContext() или «this», если это действие, в качестве нового параметр для статического метода и вызов context.getSystemService.

public static boolean isNetworkAvailable (Context context) { 
    ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

В принципе, вы, вероятно, используется для вызова getSystemService из класса, который расширяет контекст как активность.

Теперь от активности вызова что-то вроде если (appHelpers.isNetworkAvailable (это)) {

или

if (appHelpers.isNetworkAvailable (getContext())) { 

в зависимости от того, где вы вызываете его с.

Вы можете сделать вспомогательные методы статическими или добавить конструктор к своему помощнику, чтобы передать его в контексте, и чтобы хелпер сохранял контекст как член.

+0

Отличный материал, спасибо вам, Эрик! Я думал, что это проблема, связанная с тем, что я делаю это публичным, а не частным - я не знаю, что это такое, но Контекст меня смущает. Спасибо, что помогли. –

Смежные вопросы