2017-10-10 3 views
0

Je ne peux pas charger Android d'une ressource Web dans un ArrayList - quoi que je fasse, la liste est vide. Si je ne l'exécute pas dans un thread, logcat affiche une erreur StrictMode$AndroidBlockGuardPolicy.onNetwork. En java VM cela fonctionne parfaitement; le site est chargé dans la liste et je peux obtenir les données que je veux.Android ne récupère pas les données du site Web dans ArrayList

Voici le code:

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]; 
} 

Je sais qu'il a besoin d'optimisation, mais je veux d'abord faire fonctionner et me donner au moins une valeur (c'est la raison pour laquelle je ne l'un des tableaux avec un indice pour le retour). Je le vois sur debug il se connecte au site mais le ArrayList est vide et il ne fait rien.

+0

'ne peut pas faire Android pour charger le site Web dans ArrayList'. Android? Vous voulez dire votre application? Votre application Android? – greenapps

+1

En règle générale, vous utilisez une asynctask dans Android pour la mise en réseau –

+0

Oui, lorsque je lance l'application, il me donne une valeur "nulle" à partir de cela. – Rado

Répondre

2
thread.start(); 

Vous ne pouvez pas avoir de code après avoir démarré le thread car ce code sera exécuté directement et en parallèle avec le code dans le thread. Il est donc possible que ce code soit terminé avant même qu'il y ait une connexion avec le site web. Pas étonnant que votre arrayliste soit vide.

Vous devez placer ce code dans une fonction distincte et n'appeler cette fonction qu'une fois le thread terminé.

+0

Si je n'utilise pas de fil, cela me donne une erreur comme je l'ai dit au début. Même lorsque je "override" erreur avec ce StrictMode.ThreadPolicy politique = new StrictMode.ThreadPolicy.Builder(). PermitAll(). Build(); StrictMode.setThreadPolicy (stratégie); Il ne fait toujours rien. – Rado

+0

@Rado, la réponse n'indique pas que vous ne devriez pas utiliser un thread, vous devez le faire puisque vous faites un appel réseau. Il est dit que vous devez remplir votre ArrayList dans le fil – Michael

0

Je l'ai corrigé. Le problème était avec la connexion "https", quand je l'ai changé en "http", il a téléchargé le site. Mais il y avait un autre problème - il a chargé la version mobile?!? Il m'a fallu un certain temps pour comprendre cela - "http://m.sinoptik.bg/shumen-bulgaria-100727233/10-days" et j'ai dû faire un certain ajustement à l'algorithme de récupération de données pour correspondre au site mobile, mais maintenant il va bien. Les données sont les mêmes que le site original moins ~ 700 lignes de données moins, ce qui est encore mieux :)