Android没有从网站获取数据到ArrayList

时间:2017-10-10 13:20:39

标签: java android arraylist inputstreamreader

我无法让Android将Web资源加载到ArrayList中 - 无论我做什么,列表都是空的。如果我不在线程中运行它,logcat会显示StrictMode$AndroidBlockGuardPolicy.onNetwork错误。在java VM中,这是完美的工作;该网站已加载到列表中,我可以获得我想要的数据。

以下是代码:

public class WeatherData {
public static String data() {
    String[] tempsArr = new String[9];
    String[] minArr = new String[9];
    Calendar calendar = Calendar.getInstance();
    String[] weekDay = new String[1];
    SimpleDateFormat[] dayFormat = new SimpleDateFormat[1];
    dayFormat[0] = new SimpleDateFormat("E");
    weekDay[0] = dayFormat[0].format(calendar.getTime());
    final ArrayList<String> list = new ArrayList<String>();
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {

            try {
                System.setProperty("http.proxyHost", "cache.mrt.ac.lk");
                System.setProperty("http.proxyPort", "3128");

                //Document doc = Jsoup.connect(url).timeout(10000).get();

                URL link = new URL("https://www.sinoptik.bg/shumen-bulgaria-100727233/10-days");
                BufferedReader in = new BufferedReader(new InputStreamReader(link.openStream()));
                String inputLine;
                String[] arr;
                int count = 0;

                while ((inputLine = in.readLine()) != null) {
                    list.add(inputLine);
                    count++;
                }
                in.close();
            } catch (MalformedURLException me) {
                System.out.println(me);
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            }
        }
    });
    thread.start();

    dayFormat[0] = new SimpleDateFormat("E");

    weekDay[0] = dayFormat[0].format(calendar.getTime());
    int idx = 0;
    for (
            int j = 0; j < list.size() - 550; j++)

    {
        if (list.get(j).contains(weekDay[0].toString())) {
            tempsArr[idx] = getNum(list.get(j + 3));
            minArr[idx] = getNum(list.get(j + 5));
            idx++;
            calendar.add(Calendar.DAY_OF_WEEK, 1);
            weekDay[0] = dayFormat[0].format(calendar.getTime());
        }
    }

    return tempsArr[1];
}

我知道它需要优化,但我想首先让它工作并给我至少一个值(这就是为什么我只使用一个带有一个索引的数组返回)。我在调试时看到它正在连接到站点,但是ArrayList是空的,它什么也没做。

2 个答案:

答案 0 :(得分:2)

 thread.start();

启动线程后无法获得代码,因为该代码将直接执行并与线程中的代码并行执行。因此,即使在与网站建立连接之前,该代码也可能已完成。难怪你的arraylist是空的。

您必须将该代码放在单独的函数中,并且只在线程完成后调用该函数。

答案 1 :(得分:0)

我修好了。问题在于“https”连接,当我将其更改为“http”时,它下载了该网站。但还有另一个问题 - 它加载了移动版本?!?我花了一段时间来解决这个问题 - “http://m.sinoptik.bg/shumen-bulgaria-100727233/10-days”我不得不对数据提取算法进行一些调整以匹配移动网站,但现在它很好。数据与原始站点相同,减去约700行数据,这甚至更好:)