java - MpAndroidChart : IndexOutOfBoundsException -
in app im getting wifi list<scanresults>
data , trying update chart not going , , app throw exception java.lang.indexoutofboundsexception: invalid index 0, size 0
, have tried many code combination mpandroidchart nothing solve issue ... why happening ?
broadcast receiver wifi scanresults :
public class receiver extends broadcastreceiver { @suppresswarnings("constantconditions") @override public void onreceive(context context, intent intent) { new thread(new runnable() { @override public void run() { try { list<scanresult> results = mwifimanager.getscanresults(); arraylist<string> lista_bssid_e_skanuar = new arraylist<>(); arraylist<string> lista_bssid_lista_skanuar = new arraylist<>(); //boolean channel_width_supported = false; (scanresult result1 : results) { final string ssid = result1.ssid; final string channel = string.valueof(ieee80211_frequency_to_channel(result1.frequency)); final string frequency = string.valueof(result1.frequency); final string bssid = result1.bssid; final string capabilities = result1.capabilities; final string signal = string.valueof(result1.level); string security = "free"; int channel_width; if (build.version.sdk_int >= build.version_codes.m) { //channel_width_supported = true; int freq1 = result1.centerfreq0; int freq2 = result1.centerfreq1; int channel_width_freq; if (freq1 - freq2 < 0) { channel_width_freq = freq2 - freq1; } else { channel_width_freq = freq1 - freq2; } if ((integer.parseint(frequency) - channel_width_freq) <= 0) { channel_width = channel_width_freq - integer.parseint(frequency); } else { channel_width = integer.parseint(frequency) - channel_width_freq; } if (channel_width != 20 && channel_width != 40 && channel_width == 60 && channel_width != 80 && channel_width != 160) { channel_width = 21; } } else { //channel_width_supported = false; channel_width = 21; } final int finalchannel_width = channel_width; if (capabilities.contains("wpa")) { security = "wpa"; } if (capabilities.contains("wpa2")) { security = "wpa2"; } if (capabilities.contains("wep")) { security = "wep"; } final string finalsecurity = security; if (!bssid.equals("00:00:00:00:00:00")) { lista_bssid_e_skanuar.add(ssid + "/" + channel + "/" + frequency + "/" + bssid + "/" + capabilities + "/" + signal + "/" + finalsecurity + "/" + finalchannel_width); lista_bssid_lista_skanuar.add(bssid); } } synchronized (_lock) { (int = 0; < lista_bssid_e_skanuar.size(); a++) { string[] te_dhenat = lista_bssid_e_skanuar.get(a).split("/"); final string ssid_lista = te_dhenat[0]; final string channel_lista = te_dhenat[1]; final string bssid_lista = te_dhenat[3]; final string signal_lista = te_dhenat[5]; final int kanali = integer.parseint(channel_lista); int signal = integer.parseint(signal_lista) + 100; if (signal > 70) { signal = 70; } if (!lista_bssid_lista.contains(bssid_lista)) { lista_bssid_lista.add(bssid_lista); addentry(kanali - 2, 0, a, ssid_lista); addentry(kanali, signal, a, ssid_lista); addentry(kanali + 2, 0, a, ssid_lista); } else { (int = 0; < lista_bssid_lista.size(); i++) { if (!lista_bssid_lista_skanuar.contains(lista_bssid_lista.get(i))) { //maybe exception happening here ?? final int finalsignal1 = signal; final int finali = i; removeentry(kanali, finalsignal1, finali); addentry(kanali - 2, 0, finali, ssid_lista); addentry(kanali, 0, finali, ssid_lista); addentry(kanali + 2, 0, finali, ssid_lista); } else { // or here ???? final int finalsignal = signal; final int finala = a; removeentry(kanali, finalsignal, finala); addentry(kanali - 2, 0, finala, ssid_lista); addentry(kanali, finalsignal, finala, ssid_lista); addentry(kanali + 2, 0, finala, ssid_lista); } } } } } }catch (exception i){ thread.currentthread().interrupt(); } } }).start(); } }
add entry method :
private synchronized void addentry(float kanali, float sinjali, int indexi, string emri) { linedata data = mwifichart.getdata(); ilinedataset set = data.getdatasetbyindex(indexi); if (set == null) { set = createset(emri); data.adddataset(set); } data.addentry(new entry(kanali, sinjali), indexi); data.notifydatachanged(); mwifichart.notifydatasetchanged(); getactivity().runonuithread(new runnable() { @override public void run() { mwifichart.invalidate(); } }); }
remove entry method :
private synchronized void removeentry(float x_value,float y_value, int indexi) { try { linedata data = mwifichart.getdata(); if (data != null) { ilinedataset set = data.getdatasetbyindex(indexi); if (set != null) { data.removeentry(x_value - 2, indexi); data.removeentry(x_value + 0, indexi); data.removeentry(x_value + 2, indexi); data.notifydatachanged(); mwifichart.notifydatasetchanged(); } } }catch (exception i){ tastytoast.maketext(getcontext(),i.getmessage(),tastytoast.length_short,tastytoast.error); } }
i'm getting exception , app crash instantly , tried many code combination nothing ...
java.lang.indexoutofboundsexception: invalid index 0, size 0 @ java.util.arraylist.throwindexoutofboundsexception(arraylist.java:260) @ java.util.arraylist.get(arraylist.java:313) @ com.github.mikephil.charting.data.dataset.getentryforindex(dataset.java:286) @ com.github.mikephil.charting.utils.transformer.generatetransformedvaluesline(transformer.java:184) @ com.github.mikephil.charting.renderer.linechartrenderer.drawvalues(linechartrenderer.java:547) @ com.github.mikephil.charting.charts.barlinechartbase.ondraw(barlinechartbase.java:263)
update :
it seems exception not happening if code runs on ui thread , not sure , don't throws exception anymore ???
example
getactivity().runonuithread(new runnable() { @override public void run() { removeentry(kanali, finalsignal, finala); addentry(kanali - 2, 0, finala, ssid_lista); addentry(kanali, finalsignal, finala, ssid_lista); addentry(kanali + 2, 0, finala, ssid_lista); } });
in add entry method mwifichart.getdata() returning null. , trying value list. please put check on statement. if(data !=null && data.size >=indexi) ilinedataset data =data.getsetdatabyindex(indexi)
Comments
Post a Comment