2012-04-18 8 views
0

私のサーバーにJSONファイル(towns.json)があり、そこからデータを読みたいと思っています。 私はUIスレッドをブロックしないためにAsyncTaskを使うべきだと考えました。Android:AsyncTaskのJSONに関する問題

private class GetTowns extends AsyncTask<String, String, Void> { 
    protected void onPreExecute() {} 

    @Override 
    protected Void doInBackground(String... params) { 
     String readTown = readFeed(ScreenStart.this, "http://server.com/towns.json"); 
     try { 
      JSONArray jsonArray = new JSONArray(readTown); 
      town = new ObjectTown[jsonArray.length()]; 
      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject jsonObject = jsonArray.getJSONObject(i); 
       town[i] = new ObjectTown(); 
       town[i].setId(Integer.parseInt(jsonObject.getString("id"))); 
       town[i].setName(jsonObject.getString("name")); 
       town[i].setLat(Double.parseDouble(jsonObject.getString("latitude"))); 
       town[i].setLon(Double.parseDouble(jsonObject.getString("longitude"))); 
      } 
     } catch (Exception e) { 
      Log.i("Catch the exception", e + ""); 
     } 
     return null; 
    } 

    protected void onPostExecute(Void v) {} 
} 

をそしてここでreadFeed()関数:次のように私はそれをやっていることはなく、たまに... 時々作品

public static String readFeed(Context context, String str) { 
    StringBuilder builder = new StringBuilder(); 
    HttpClient client = new DefaultHttpClient(); 
    HttpGet httpGet = new HttpGet(str); 

    try { 
     HttpResponse response = client.execute(httpGet); 

     StatusLine statusLine = response.getStatusLine(); 
     int statusCode = statusLine.getStatusCode(); 
     if (statusCode == 200) { 
      HttpEntity entity = response.getEntity(); 
      InputStream content = entity.getContent(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(content, "ISO-8859-1")); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       builder.append(line); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return builder.toString(); 
} 

、doInBackground()この例外がスローされます:

org.json.JSONException:

...の文字0での入力の終了を正確に私が間違っているのか?

答えて

1

サーバーがデータを返さないようですが、文字列が空でないことを確認しましたか?あなたが使用できる文字列にHttpEntityを有効にするには:

String jsonStr = EntityUtils.toString(httpEntity); 

私は、企業がそれを使用する前に、ヌルと異なる場合あなたもチェックする必要がありますと仮定します。

+0

問題は、_sometimes_がこのエラーをスローすることだけです。 (サーバー上のファイルは常に利用可能です)。 – user934779

+1

エラー時にreadTownの内容をチェックしましたか? – marcinj

+0

readTownの内容が結果を返さないことがあります。それが問題でした。 – user934779

1

AsyncTasksを使用してREST要求を送信することはお勧めできません。 AsyncTasksは、ネットワークなどの長時間実行される操作には使用しないでください。非常に簡単にメモリリークを作成し、それらが不十分活動のライフサイクル

  • に結びついている

    それは、ネットワーキングと、代替ソリューションをご紹介することになると我々は彼らの特徴や欠点、ローダー、AsyncTasksの詳細なビューを与える:RoboSpice。

    さらに、この問題を説明するためにan infographicsを提供しました。 Sqliteをデータベースのアクセスカーソルが、:いくつかの単語で

    • AsyncTasksをそれを置くためには
    • ローダーは、彼らがために設計されてきた何のためにかなり良いです彼らは悪い活動のライフサイクルに関連付けられているとして欠陥であり、メモリリークを作成しますネットワーキングのサポートを提供していません。彼らはこれのための間違ったツールです。
    • RoboSpiceはサービスでネットワークリクエストを実行し、ダウンロードはAndroidサービスで実行され、メモリは管理され、RESTリクエストの書き込みをサポートします。

    私はRoboSpice Motivations appをダウンロードすることをお勧めします、それは本当にこの中に、深さを説明し、サンプルといくつかのバックグラウンド処理を行うためのさまざまな方法のデモンストレーションを提供します。

  • 関連する問題