loopunrolling ha scritto:
11-25 14:21:06.855 26915-26915/com.woops.neon.woops E/art? Throwing OutOfMemoryError "Failed to allocate a 68706640 byte allocation with 16777216 free bytes and 44MB until OOM"
...
java.lang.OutOfMemoryError: Failed to allocate a 68706640 byte allocation with 16777216 free bytes and 44MB until OOM
at java.util.ArrayList.add(ArrayList.java:118)
at android.widget.ArrayAdapter.add(ArrayAdapter.java:179)
at com.woops.neon.woops.MainActivity.onCreate(MainActivity.java:28)
...
Il messaggio mi sembra abbastanza esplicativo: non hai abbastanza memoria per aggiungere dei dati all'arrayadapter. Nota comunque che stai cercando di inserire più 65 MB di dati, quindi probabilmente hai commesso qualche errore.. Ad esempio ho notato che aggiungi 2 volte ogni elemento della lista all'adapter (la prima volta passando "r" al costruttore dell'adapter, la seconda volta tramite il ciclo for, per cui elimina quest'ultimo).
Inoltre, supponendo che tu abbia richiesto nel manifest i permessi idonei (es: android.permission.CHANGE_WIFI_STATE, per accendere/spegnere il wifi, android.permission.ACCESS_FINE_LOCATION e android.permission.ACCESS_COARSE_LOCATION per ottenere i risultati di uno scan, e forse ne servono anche altri), il metodo che usi per controllare i risultati è errato.
Se guardi nella documentazione, infatti, noterai che il metodo startScan() ha la seguente descrizione:
Request a scan for access points. Returns immediately. The availability of the results is made known later by means of an asynchronous event sent on completion of the scan.
Questo significa che non puoi chiamare "startScan()" e, subito dopo, "getScanResults()", perché non è detto che lo scan sia finito.
La soluzione è creare una sottoclasse di
BroadcastReceiver con l'intentfilter idoneo (in questo caso devi monitorare l'azione
SCAN_RESULTS_AVAILABLE_ACTION) per essere notificato di quando uno scan termina. E' all'interno di esso che potrai poi chiamare in sicurezza il metodo "getScanResults()", perché a quel punto lo scan sarà sicuramente terminato e la lista di reti wifi sarà disponibile.
Nota che affinché il BroadcastReceiver funzioni è necessario registrarlo all'interno della tua app, e uno dei modi per farlo è attraverso il metodo (tipicamente chiamato nella callback "onResume()"). Infine per evitare di sprecare risorse inutilmente è sempre meglio chiamare anche il metodo (tipicamente nella callback "onPause()"), per rimuovere il BroadcastReceiver