2017-09-29 23 views
0

当从Service调用NetworkInfo.isConnectedOrConnecting()时,会面临奇怪的行为。尽管手机已连接到网络,但它仅返回false。从活动和片段中,此片段按预期工作。NetworkInfo.isConnectedOrConnecting()在服务中返回FALSE

public boolean isOnline() { 
    if (mContext == null) { 
     return false; 
    } 

    NetworkInfo netInfo = mConnectivityManager.getActiveNetworkInfo(); 
    return netInfo != null && netInfo.isConnectedOrConnecting(); 
} 

任何人都遇到过这个问题?也许还有另一种检查服务内部网络连接的方法。

+0

请添加设备型号和Android版本。 –

+0

@cgomezmendez,在手机上试用Nexus 5x Android 8.0和仿真器Nexus 5 Android 6.0 – AnZ

+0

它返回false,因为netinfo == null或因为netInfo.isConnectedOrConnecting为false? –

回答

1

在你的服务类中试试类似这样的东西。

public boolean isOnline(Context context) { 
    ConnectivityManager manager = (ConnectivityManager) 
      context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (manager == null) { 
     return false; 
    } 
    NetworkInfo networkInfo = manager.getActiveNetworkInfo(); 
    if (networkInfo != null){ 
     if (networkInfo.isConnectedOrConnecting()) { 
      return true; 
     } 
    } 
    return false; 
} 

编辑:利用上下文来单:

public class ServiceContextManager { 
    private static ServiceContextManager instance; 

    public static ServiceContextManager getInstance(Context context) { 
     if (instance == null) { 
      instance = new ServiceContextManager(context.getApplicationContext()); 
     } 

     return instance; 
    } 

    private Context mContext; 

    private ServiceContextManager(Context context) { 
     mContext = context; 
    } 
} 
+0

已经试过了。两者都不起作用...... – AnZ

+0

这里的问题是我们不知道上下文来自哪里,并且特别是在服务上持有该对象的引用并不安全。使用单身。 – codeFreak

+0

检查我更新的答案。 – codeFreak

1

我用的是确切的代码,并面临着同样的问题,直到昨天,当我发现更好的东西。它可能看起来像不同,但这真的很好,因为它还检查是否有工作的互联网连接或不作为isNetworkConnected()将返回true的情况下连接的WiFi没有互联网,所以你可以使用此代码。

public boolean isOnline() throws InterruptedException, IOException 
    { 
     String command = "ping -c 1 google.com"; 
     return (Runtime.getRuntime().exec (command).waitFor() == 0); 
    } 

您还可以将google.com更改为任何网站,因为google.com可能在某些国家/地区停用。
我在一个活动中使用这个而不是服务,但它会工作。

+0

该解决方案有效,但会冻结该线程。有时太久.. – AnZ

+0

@AnZ我正在使用它,有时连接可能太慢,但没有面临任何问题。你怎么能这么肯定,冻结是因为这个? –

+0

对于一些不依赖执行速度的情况,这可能是可以应用的。但那不是我的情况。替代方案的解决方案很好。 – AnZ