2013-10-29 25 views
3

在我的应用程序完全依赖于网络,即,我从网络获取数据(带文本的图像),并只显示在我的布局。为此,我的主要问题是如何处理网络连接。我使用下面的代码来检查设备是否连接到网络。如何处理Android应用程序中的网络连接不畅?

public static boolean hasConnection() { 
    ConnectivityManager cm = (ConnectivityManager) MbridgeApp.getContext().getSystemService(
     Context.CONNECTIVITY_SERVICE); 

    NetworkInfo wifiNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
    if (wifiNetwork != null && wifiNetwork.isConnected()) { 
     return true; 
    } 

    NetworkInfo mobileNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
    if (mobileNetwork != null && mobileNetwork.isConnected()) { 
     return true; 
    } 

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    if (activeNetwork != null && activeNetwork.isConnected()) { 
     return true; 
    } 

    return false; 
    } 
  1. 这段代码给出了关于该设备是否连接到网络或不的信息。
  2. 我的问题会出现,一段时间网络连接但信号强度太低,这种情况下,我的应用程序需要更多的时间(从API中获取数据),经过很长时间的应用程序冻结或崩溃。
  3. 是否有可能设置信号强度的最小范围,如果它低于范围,我只是通知吐司消息给用户。
+0

看到我的[answer](http://stackoverflow.com/a/17718233/2198638),也许它可以帮助你。 – Brtle

回答

0

您可以为您的http调用设置一个超时,同时在单独的线程上使用它们,并在为用户友好的用户界面加载时显示一些进度。

编辑

可以使用的AsyncTask来获取数据,并没有需要检查的连接,作为会的AsyncTask在任何时间完成,如果设备没有连接。

final ServerHit serverHit = new ServerHit(this); 
serverHit.execute(url); 
// set a timeout 
Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       if (serverHit.getStatus() == AsyncTask.Status.RUNNING) 
        serverHit.cancel(true); 
      } 
     }, timeout); 
+0

我为我的api调用的 – Aerrow

+0

使用asyc任务,您可以使用带有postDelayed的hanlder来取消AsyncTask。 –

+0

您可以使用缓存,离线,请求失败,超过超时强制应用程序从缓存中读取 –

相关问题