2017-09-28 3 views
0

Je ressors d'erreur de mémoire si la fonction doesWifiExist est fausse s'il est vrai tout fonctionne quelqu'un normally.Can me dire ce que mi faire malProblèmes avec erreur de dépassement de mémoire

L'idée est d'obtenir une liste des réseaux wifi à proximité et vérifiez si le réseau inséré existe dans la liste.

Voici le code de balayage du réseau wifi et la fonction qui vérifie si le réseau wifi existe.

MainActivity:

private WiFiConnection _wifiConnection = null; 
    static final int MY_PERMISSIONS_REQUEST = 1042; 
    private static final String PERMISSIONS_TAG = "PERMISSION"; 
    ... 
    @Override 
    protected void onStart() { 
     super.onStart(); 
     _wifiConnection = new WiFiConnection(this); 
     startScan(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 

     _wifiConnection.stopScan(); 
     unregisterReceiver(_wifiScanReceiver); 
    } 

    void startScan() { 
     checkPermission(this); 

     registerReceiver(_wifiScanReceiver, 
       new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
     Thread t = new Thread(_wifiConnection.getWifiScanner()); 
     t.start(); 
    } 

    private final BroadcastReceiver _wifiScanReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context c, Intent intent) { 
      if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 
       if (_wifiConnection != null && _wifiConnection.isWifiEnabled()) { 
        _wifiConnection.updateScanData(); 
       } 

      } 
     } 
    }; 


    public static boolean checkPermission(Activity activity) { 
     boolean permission = true; 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      List<String> requiringList = new ArrayList<>(); 
      permission = activity.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED; 
      Log.d(PERMISSIONS_TAG, "ACCESS_COARSE_LOCATION: " + permission); 
      if (!permission) { 
       requiringList.add(Manifest.permission.ACCESS_COARSE_LOCATION); 
      } 

      if (requiringList.size() > 0) { 
       String[] stringArray = requiringList.toArray(new String[0]); 
       activity.requestPermissions(stringArray, MY_PERMISSIONS_REQUEST); 
      } 
     } 
     return permission; 
    } 

    private boolean doesWifiExist(String s){ 
      String[] array = s.split(" "); 
      String ssid = array[0]; 
      boolean flag = false; 
      //Check if wifi exists in the area 
      for(int i = 0 ; i < _wifiConnection.getListSSIDs().size(); i++){ 
       if(_wifiConnection.getListSSIDs().get(i).equals(ssid)){ 
        flag = true; 
        break; 
       } 
      } 
      return flag; 
     } 

classe WiFiConnection:

public class WiFiConnection 
    { 
     private static final int SCAN_INTERVAL = 5000; 

     final private List<String> _listSSIDs = new ArrayList<>(); 

     private WifiManager _wifiManager; 

     private final WiFiScanner _startScan = new WiFiScanner(); 
     private List<ScanResult> scanResults; 

     WiFiConnection(Activity activity) { 
      _wifiManager = (WifiManager) activity.getApplicationContext().getSystemService(Context.WIFI_SERVICE); 
     } 

     //Puts wifi networks in a list 
     public List<String> getListSSIDs() { 

      for(int i = 0; i < scanResults.size(); i++) 
      { 
       _listSSIDs.add(scanResults.get(i).SSID); 
      } 
      return _listSSIDs; 

     } 
     WiFiScanner getWifiScanner() { return _startScan; } 
     void stopScan() { _startScan.stop(); } 

     boolean isWifiEnabled() { return _wifiManager.isWifiEnabled(); } 

     //Gets the wifi networks 
     void updateScanData() { 
      if ((_wifiManager != null && _wifiManager.isWifiEnabled())) { 
       scanResults = _wifiManager.getScanResults(); 
      } 
     } 

     //Scans at an interval 
     private class WiFiScanner implements Runnable 
     { 
      private boolean _stop = false; 
      public void stop() {_stop = true;} 
      @Override 
      public void run() { 
       while (!_stop) { 
        _listSSIDs.clear(); 
        _wifiManager.startScan(); 
        try { 
         Thread.sleep(SCAN_INTERVAL); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    } 

Le code où doesWifiExist est utilisé.

//Check if wifi exists in the area 
if(doesWifiExist(barcode.displayValue)){ 
    //Connects to wifi 
    WifiConnect(barcode.displayValue); 
    //Saves item in db 
    insertItem(); 

    if(networkSecurity.equals("None")){ 
     networkPass = empty; 
    } 
    //Adds item to recyclerview 
    historyItems.add(0, new HistoryItem(wifiName + " " + networkSSID, wifiPass + " " + networkPass)); 
    adapter.notifyItemInserted(0); 
} else 
     Snackbar.make(findViewById(R.id.main_activity), R.string.snackInvalidQrCode, Snackbar.LENGTH_SHORT).show(); 
+0

S'il vous plaît ajouter le code qui utilise le résultat de l'appel à 'doesWifiExist'. – Berger

+0

@Berger j'ai ajouté le code. – shotofop

Répondre

0

Cette méthode est appelée plusieurs fois, et elle ajoute à chaque fois scanResults à la fin du champ _listSSIDS.

public List<String> getListSSIDs() { 
     for(int i = 0; i < scanResults.size(); i++) 
     { 
      _listSSIDs.add(scanResults.get(i).SSID); 
     } 
     return _listSSIDs; 
    } 

Utiliser une variable locale avec une nouvelle liste ou mieux Définir ici.

REPLACE au lieu

 for(int i = 0 ; i < _wifiConnection.getListSSIDs().size(); i++){ 
      if(_wifiConnection.getListSSIDs().get(i).equals(ssid)){ 
       flag = true; 
       break; 
      } 
     } 

avec

 flag = _wifiConnection.hasSSID(String ssid); 

    public boolean hasSSID(String ssid) { 
     for (int i = 0; i < scanResults.size(); i++) { 
      if (ssid.equals(scanResults.get(i).SSID)) { 
       return true; 
      } 
     } 
     return false; 
    }