2016-09-01 2 views
0

私はJSON URLからデータを読み込むアプリケーションを持っていますが、ロードに約8秒かかるので、これは解析のためだと思います。
もっと速く簡単に解析する方法があるかどうかを知りたいですか?JSONを解析する最速の方法

これは私がJSONを読み込むために使用しています関数です。

public class LoadJson extends AsyncTask <String, Void, String> { 


    @Override 
    protected String doInBackground(String... params) { 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 

     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 
      InputStream stream = connection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 
      StringBuffer buffer = new StringBuffer(); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 
      String finalJson = buffer.toString(); 
      return finalJson; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return "Faild"; 
     } 

    } 
} 

と:

public JSONArray ExcuteLoad() { 

    LoadJson task = new LoadJson(); 
    String resualt = null; 

    try { 
     resualt = task.execute("MY_JSON_FILE_URL").get(); 
     JSONObject json = new JSONObject(resualt); 
     JSONArray jarray = json.getJSONArray("marcadores"); 


     return jarray; 

    } 

    catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

UPDATE 1:私は何のコードベースを変更

[OK]を人々あなたはonPostExecuteを使用することを提案しましたが、問題は私がasyncTaskの外でjsonarrayの値を返すことができないということです。本当に混乱しました....

public class LoadJson extends AsyncTask <String, Void, String> { 


     public class LoadJson extends AsyncTask <String, Void, String> { 

public interface AsyncResponse { 
    void processFinish(String output); 
} 

public AsyncResponse delegate = null; 

public LoadJson (AsyncResponse delegate){ 
    this.delegate = delegate; 
} 


    @Override 
    protected String doInBackground(String... params) { 
     String resualt = ""; 
     URL url; 
     HttpURLConnection urlConnection = null; 

     try { 
      url = new URL(params[0]); 
      urlConnection = (HttpURLConnection)url.openConnection(); 

      InputStream in = urlConnection.getInputStream(); 

      InputStreamReader reader = new InputStreamReader(in); 

      int data = reader.read(); 

      while (data != -1) { 
       char current = (char) data; 
       resualt += current; 
       data = reader.read(); 
      } 
      return resualt; 
     } 
     catch (Exception e) { 

      e.printStackTrace(); 

      return "Failed"; 
     } 

    } 

@Override 
protected void onPostExecute(String result) { 
    delegate.processFinish(result); 
    } 
} 

と私のフラグメントクラス:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_main, container, false); 

    LoadJson asyncTask = (LoadJson) new LoadJson (new LoadJson.AsyncResponse(){ 

     @Override 
     public void processFinish(String output){ 
      //Here you will receive the result fired from async class 
      //of onPostExecute(result) method. 
      try { 
       JSONObject jsonObject = new JSONObject(output); 
       JSONArray jsonArray = jsonObject.getJSONArray("marcadores"); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).execute(); 
+0

http://square.github.io/retrofit/ –

+1

あなたがやっている奇妙な構文解析のほかに、あなたが持っています同期タスクを 'task.execute()。get() 'とします。 –

+0

ジャクソンを解析するためにジャクソンを使用することができます。なぜなら、速くて、ほとんどのベンダーがJaksonをJSONの解析に使用しているからです。 DropBox、Box ..... FYI:http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ – ViramP

答えて

1

あなたの問題は、JSONを解析されていません。あなたはそれをスピードアップすることはできません。おそらく別のライブラリを使用しても、それを速くすることはできません。 (私は開発時間ではなく、読み込み時間について話しています)。

あなたの要求とインターネット速度の仕方がわかります。

たとえば、これはAsyncTaskの使用方法ではありません。

resualt = task.execute("MY_JSON_FILE_URL").get(); 

同期呼び出しを非同期で行ったためです。つまり、get()メソッドはブロックし、結果を待つため、時間がかかり、データがゆっくり読み込まれます。

ライブラリはAsyncTaskの複雑さを軽減し、開発を「迅速かつ簡単に」できますが、実際にはAsyncTaskクラスのonPostExecuteを使用してメインスレッドから非同期にデータをロードします。

私が与えることができる最良の例は、Using a callback to return the data


で更新

​​
+0

あなたは正しいですが、問題は次に私のコードをすべて実行する必要があります:@Override void processFinish(String output){そうでなければ、渡された変数にアクセスできませんこのオーバーライド関数でコードを実行すると、asynctaskにもう一つの苦痛が...! – Blacksword

+0

ネットワークリクエストを行い、doInBackgroundのJSONObjectに対する応答を解析することができます。 JSONObjectをonPostExecute(processFinishではなく)に戻すことができます。そこから、UIスレッドを更新します。これがAsyncTaskの仕組みです。 Volley、OkHttp、Retrofitのような他のオプションがありますが、これは外部ライブラリなしの答えです –

+0

確かに別のクラスの中でAsyncTaskを使用していて、それを私のフラグメントクラスに渡したいのですが、それらがすべて1クラス、はい、それらは分かれています – Blacksword

関連する問題