2014-09-19 105 views
1

我有一个开机运行了一个应用程序和伟大工程,我的新的问题是,我的应用程序需要连接到互联网和我的应用程序被启动之前有一个互联网连接,因此,我得到一个404错误我的应用程序里面,Android上运行的代码连接到互联网/ WIFI

是有没有去下面把这个代码在一个循环中,如果网络连接失败,他们再次尝试代码,就像一个尝试捕捉八九不离十的事情。我对java很陌生,不知道如何做到这一点。这里是我的代码:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //Loop Here to test if internet connection, if not try again 

     WebView myWebView = (WebView) findViewById(R.id.webview); 
     myWebView.setWebViewClient(new WebViewClient()); 
     myWebView.getSettings().setJavaScriptEnabled(true); 
     myWebView.loadUrl("http://example.com"); 

    } 

我也试着用try和catch以下现在我的应用程序将无法运行干脆:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Socket socket = new Socket(); 
     InetSocketAddress address = new InetSocketAddress("www.google.com",80); 
     try{ 
      socket.connect(address, 3000); 
      WebView myWebView = (WebView) findViewById(R.id.webview); 
      myWebView.setWebViewClient(new WebViewClient()); 
      myWebView.getSettings().setJavaScriptEnabled(true); 
      myWebView.loadUrl("http://example.com"); 
     } catch (Exception e){ 
      WebView myWebView = (WebView) findViewById(R.id.webview); 
      myWebView.setWebViewClient(new WebViewClient()); 
      myWebView.getSettings().setJavaScriptEnabled(true); 
      myWebView.loadUrl("http://example.com"); 

     } finally { 
      try {socket.close();} 
      catch (Exception e){} 
     } 


    } 

请帮助:(

而且我有也一直在玩这个:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Thread t = new Thread(); 
     try{ 
      while(!isConnected(WifiExplorerActivity.this)){ 
       Thread.sleep(1000); 
      } 
     } catch (Exception e){ 

     } 
     WebView myWebView = (WebView) findViewById(R.id.webview); 
     myWebView.setWebViewClient(new WebViewClient()); 
     myWebView.getSettings().setJavaScriptEnabled(true); 
     myWebView.loadUrl("http://example.com"); 

    } 

并将此添加到我的清单:

<activity android:name=".WifiExplorerActivity" >   
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
    </activity> 
+0

以具有

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

关怀“把下面这段代码,他们尝试再次编码“ - 你永远不要使用这样的循环,其目的只是在等待事情发生的时候一直运行;详细了解事件驱动的编程。 – spoko 2014-09-19 14:30:55

回答

1

你最好尝试一个BroadcastReceiver:

使用:要么使用全班或只是调用静态方法

public class NetworkManager extends BroadcastReceiver { 

    protected static final String TAG     = NetworkManager.class.getSimpleName(); // log 
    protected Context    mContext; 
    protected boolean    mNoConnectivity; 
    protected String    mReason; 
    protected boolean    mIsFailover; 
    protected static boolean  mIsConnected  = false; 
    protected static boolean  mIsConnectivityGood = true; 

    public NetworkManager(Context context) { 
     this.mContext = context; 
    } 

    public void registerReceivers() { 
     mContext.registerReceiver(this, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
    } 

    public boolean isConnectingToInternet() { 
     ConnectivityManager connectivity = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connectivity != null) { 
      NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
      if (info != null) 
       for (int i = 0; i < info.length; i++) 
        if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
         return true; 
        } 
     } 
     return false; 
    } 

    /** 
    * @param context 
    * @return 
    */ 
    public static NetworkInfo getNetworkInfo(Context context) { 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     return cm.getActiveNetworkInfo(); 
    } 

    /** 
    * @param context 
    * @return 
    */ 
    public static boolean isConnected(Context context) { 
     NetworkInfo info = getNetworkInfo(context); 
     return (info != null && info.isConnected()); 
    } 

    /** 
    * @param context 
    * @return 
    */ 
    public static boolean isConnectedWifi(Context context) { 
     NetworkInfo info = getNetworkInfo(context); 
     return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI); 
    } 

    /** 
    * @param context 
    * @return 
    */ 
    public static boolean isConnectedMobile(Context context) { 
     NetworkInfo info = getNetworkInfo(context); 
     return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE); 
    } 

    /** 
    * @param context 
    * @return 
    */ 
    public static boolean isConnectedFast(Context context) { 
     NetworkInfo info = getNetworkInfo(context); 
     return (info != null && info.isConnected() && isConnectionFast(info.getType(), info.getSubtype())); 
    } 

    protected static boolean isConnectionFast(int type, int subType) { 
     if (type == ConnectivityManager.TYPE_WIFI) { 
      return true; 
     } else if (type == ConnectivityManager.TYPE_MOBILE) { 
      switch (subType) { 
       case TelephonyManager.NETWORK_TYPE_1xRTT: 
        return false; // ~ 50-100 kbps 
       case TelephonyManager.NETWORK_TYPE_CDMA: 
        return false; // ~ 14-64 kbps 
       case TelephonyManager.NETWORK_TYPE_EDGE: 
        return false; // ~ 50-100 kbps 
       case TelephonyManager.NETWORK_TYPE_EVDO_0: 
        return true; // ~ 400-1000 kbps 
       case TelephonyManager.NETWORK_TYPE_EVDO_A: 
        return true; // ~ 600-1400 kbps 
       case TelephonyManager.NETWORK_TYPE_GPRS: 
        return false; // ~ 100 kbps 
       case TelephonyManager.NETWORK_TYPE_HSDPA: 
        return true; // ~ 2-14 Mbps 
       case TelephonyManager.NETWORK_TYPE_HSPA: 
        return true; // ~ 700-1700 kbps 
       case TelephonyManager.NETWORK_TYPE_HSUPA: 
        return true; // ~ 1-23 Mbps 
       case TelephonyManager.NETWORK_TYPE_UMTS: 
        return true; // ~ 400-7000 kbps 
       case TelephonyManager.NETWORK_TYPE_UNKNOWN: 
       default: 
        return false; 
      } 
     } else { 
      return false; 
     } 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     mNoConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 
     mReason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON); 
     mIsFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); 
     // 
     if (mNoConnectivity) { 
      mIsConnected = false; 
     } else { 
      if (isConnectedFast(mContext)) { 
       mIsConnectivityGood = true; 
      } else { 
       mIsConnectivityGood = false; 
      } 
      mIsConnected = true; 
     } 
    } 
} 
+1

我已经导入了BroadcastReceiver:'import android.content.BroadcastReceiver;'我将如何重写我的函数以继续尝试连接,直到它连接? – 2014-09-19 14:33:35

+0

例如,如何检查与“isConnected”方法的连接性,并测试结果“true/false”。如果这是真的只是做了要求,如果是假的通知用户,并提供了一种重试 – 2014-09-19 14:38:26

1

它应该工作:

public class SMSReceiver extends BroadcastReceiver 
{ 
    public void onReceive(Context context, Intent intent) 
    { 
     WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
      wifiManager.setWifiEnabled(true);//make it enabled 
     if(wifiManager.isWifiEnabled()){//if its enabled 
//your code... 
       } 
     } 
    } 

您应该对您的舱单有要求:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>//if you want to change it 
+0

我不知道如果我理解这个...我是新来的Java,我想为此创造一个新的活动文件码?我怎么会在我的MainAcitivty中调用我的onCreate函数? – 2014-09-19 19:34:07

+0

只为未来的访客。您还需要在'Manifest'中声明'receiver'和'intent-filter'。 – 2017-10-20 16:51:00

0

此方法适用于我:在一个循环中,如果网络连接失败

public static boolean isConnectivityOn(Context ctx) { 
    boolean resCode = false; 

    try { 
     ConnectivityManager cm = 
       (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); 

     resCode = cm.getActiveNetworkInfo().isConnectedOrConnecting(); 

    } catch (Exception e) { 
     // TODO: handle exception 
     e.printStackTrace(); 

    } 

    return resCode; 
} 

在清单