Пытаюсь сделать приложение, которое будет парсить страницу с расписанием автобуса и выводить его.
Суть в том, чтобы расписание бралось первой остановки и если автобус будет не раньше, чем текущее время. То есть, если сейчас время 18:10, то надо вывести все оставшееся расписание с 18:10.
http://mybuses.ru/moscow/bus/734/
В идеале был бы показ только 3 автобусов, которые ближе всего к текущему времени.
class main extends AsyncTask
String Bus1,Sys_time,wtf;
@Override
protected Void doInBackground(Void... params) {
String table="";
String time;
Integer first,second;
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
Date date = cal.getTime();
Integer mHour = date.getHours();
Integer mMinute = date.getMinutes();
if(mMinute<10){
mMinute=date.getMinutes()+10;
}
String curr_time=mHour.toString()+":"+mMinute.toString();
Document doc;
try {
doc = Jsoup.connect("http://mybuses.ru/moscow/bus/734/").get();
Element table_site=doc.select("table").get(0);
Element rows1=table_site.select("tr").get(1);
Iterator
while (rowIterator.hasNext()) {
Element e = doc.select("tr").get(2);
String e_1=e.attr("class");
str1=e_1.indexOf("-");
str2=e_1.indexOf(":");
str3=e_1.indexOf("-");
str4 = e_1.indexOf(":");
first = Integer.parseInt(e_1.substring(str1+1, e_1.indexOf(str1+2)));
second = Integer.parseInt(e_1.substring(str2+1, e_1.indexOf(str2+2)));
if (first>=mHour && second>=mMinute) {
Element rows=table_site.select("tr").get(1);
Element record1=rows.select("td").get(1);
Iterator
table="Автобус прибудет на Ст. Солнечная в "+wtf+" (через n минут)
Автобус прибудет на ГМС3 в "+time2.next().text();
} catch (IOException e) {
e.printStackTrace();
}
Bus1=table;
Sys_time=curr_time;
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
textView.setText("Текущее время: "+Sys_time+"
Расписание автобусов:
"+Bus1);
}
}
В этом коде ошибка:
Caused by: java.lang.StringIndexOutOfBoundsException: length=41; regionStart=23; regionLength=-24
в строке
first = Integer.parseInt(e_1.substring(str1+1, e_1.indexOf(str1+2)));
Как ее можно исправить? В моей задумке было получить время из названия класса на сайте, т.к. в названии класса указано время первой остановки sh2 columnIsVisible 0-05:26-01-0002-0001, где 05:26 - время. Попытался вырезать это время и сравнить с текущим.
Ответ
Исключение вам английским языком говорит что вы вышли за границы строки.
А теперь попробуем разобрать фрагмент вашего кода.
str1 = e_1.indexOf("-");
...
...
first = Integer.parseInt(e_1.substring(str1+1, e_1.indexOf(str1+2)));
в строке e_1 строка для парсинга.
в целочисленной переменной str1 индекс символа -
в переменную first хотим получить целое число, в которое преобразуется строка из двух символов после символа -
Тут все понятно. А вот дальше начинается интересное.
e_1.indexOf(str1+2) - тут вы пытаетесь найти индекс вхождения в исходную строку символа, который является суммой чисел от индекса str1+2. Т.е. собственно нелогичная и некорректная операция. Думаю что вполне можно заменить это просто нв str1+3. +3 - потому что конечный индекс не включается в результат операции.
Т.е. код должен быть.
first = Integer.parseInt(e_1.substring(str1+1, str1+3));
Аналогично и для получения переменной second
Комментариев нет:
Отправить комментарий