2017-10-10 5 views
0

AndroidリソースをArrayListに読み込むことはできません。何をしてもリストは空です。スレッドで実行しないと、logcatにStrictMode$AndroidBlockGuardPolicy.onNetworkというエラーが表示されます。 Java VMでは、これは完全に動作しています。サイトがリストにロードされ、私が望むデータを取得できます。ここでAndroidがウェブサイトからArrayListにデータをフェッチしない

コードは次のとおりです。

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

私はそれが最適化が必要と知っているが、私は一つの指標で一つだけのアレイを使用する理由です(それは少なくとも1つの値を仕事と私を与える作るために最初にしたいです戻り値)。私はそれがサイトに接続しているデバッグでそれを見るが、ArrayListは空であり、何もしていない。

+0

'AndroidをウェブサイトをArrayListにロードすることはできません。アンドロイド?あなたはあなたのアプリを意味しますか?あなたのAndroidアプリ? – greenapps

+1

通常、ネットワーキングのためにAndroidでAsynctaskを使用しています。 –

+0

はい、私がアプリを実行すると、これから "null"値が得られます。 – Rado

答えて

2
thread.start(); 

そのコードは、スレッド内のコードを直接かつ並列に実行されるように、あなたがスレッドを開始した後、あなたはコードを持つことはできません。したがって、Webサイトとの接続が確立される前でもそのコードが終了する可能性があります。あなたのarraylistは空ではありません。

あなたはそのコードを別の関数に入れて、スレッドが終了した後にその関数を呼び出す必要があります。

+0

スレッドを使用しないと、最初に言ったようにエラーが出ます。これで "オーバーライド"エラーが発生した場合でも、 StrictMode.ThreadPolicyポリシー= new StrictMode.ThreadPolicy.Builder()。permitAll()。build(); StrictMode.setThreadPolicy(policy); それでも何もしません。 – Rado

+0

@Radoの答えには、スレッドを使用すべきではないことが明記されていません。ネットワークコールを行っているからです。それは、スレッド内でArrayListを作成する必要があります – Michael

0

私はそれを修正しました。問題は "https"接続で、サイトをダウンロードした "http"に変更したときでした。しかし、別の問題がありました - それはモバイル版をロードしましたか?私はこのことを理解するのに少し時間がかかりました。 "http://m.sinoptik.bg/shumen-bulgaria-100727233/10-days"と私は、モバイルサイトと一致するようにデータフェッチアルゴリズムを調整しなければなりませんでしたが、今は問題ありません。データは元のサイトから700行分のデータを差し引いたものと同じですが、これはさらに優れています。

関連する問題