2017-01-04 9 views
0

Я использую Volley для получения формата JSON от сервера следующим путем:Следующий код выполняется, прежде чем данные хранятся в файле JSON

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.activity_device_report); 

     setContentView(R.layout.activity_fuel); 
     linechart = (LineChart) findViewById(R.id.lineChart); 

     requestQueue = Volley.newRequestQueue(this); 
     JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, url, 

       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         try{ 
          JSONArray dataset = response.getJSONArray("dataset"); 
          JSONObject petrol = dataset.getJSONObject(0); 
          JSONObject diesel = dataset.getJSONObject(1); 
          JSONArray categories = response.getJSONArray("categories"); 

          JSONArray petrolarray = petrol.getJSONArray("data"); 
          JSONArray dieselarray = diesel.getJSONArray("data"); 
          Log.d("debug","Size of PetrolArray: " + petrolarray.length()); 
          for(int i = 0; i<petrolarray.length();i++) { 
           Log.d("debug", "Petrol Prices consists of: " + petrolarray.getJSONObject(i).getString("value")); 
           float prtl = Float.parseFloat(petrolarray.getJSONObject(i).getString("value")); 
           float dsl = Float.parseFloat(dieselarray.getJSONObject(i).getString("value")); 
           petrolPrices.add(new Entry(i,prtl)); 
           dieselPrices.add(new Entry(i,dsl)); 
           xMonths.add(categories.getJSONObject(i).getString("label")); 
          } 
         } catch (JSONException e){ 
          e.printStackTrace(); 
         } 
        } 
       }, 

       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 
     requestQueue.add(req); 

     ArrayList<ILineDataSet> lineDataSets= new ArrayList<>(); 

     LineDataSet lineDataSet1 = new LineDataSet(petrolPrices,"petrol"); 
     lineDataSets.add(lineDataSet1); 

     Log.d("debug","Size of PetrolPrices: " + petrolPrices.size()); 
     linechart.setData(new LineData(lineDataSets)); 
     linechart.setVisibleXRangeMaximum(12); 
    } 

Когда я проверить этот код, Debug сообщение с «Размер «PetrolPrices» появляется первым, а затем появляется сообщение «Размер PetrolArray» Debug Messages. Это означает, что маркер PetrolPrices пуст, когда он рисует график, вызывающий ошибку. Данные не добавляются в него до тех пор, пока код не будет раньше.

Я не уверен, объяснил ли я это хорошо, но, надеюсь, этого достаточно. Как я могу исправить эту проблему?

ответ

1

Настоятельно рекомендуется использовать функции, чтобы убедиться, что ваш код хорош для чтения и отслеживания ошибок.

Используйте код следующим образом.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_fuel); 
    linechart = (LineChart) findViewById(R.id.lineChart); 

    requestQueue = Volley.newRequestQueue(this); 
    JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, url, 

      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        try{ 
         JSONArray dataset = response.getJSONArray("dataset"); 
         JSONObject petrol = dataset.getJSONObject(0); 
         JSONObject diesel = dataset.getJSONObject(1); 
         JSONArray categories = response.getJSONArray("categories"); 

         JSONArray petrolarray = petrol.getJSONArray("data"); 
         JSONArray dieselarray = diesel.getJSONArray("data"); 
         Log.d("debug","Size of PetrolArray: " + petrolarray.length()); 
         for(int i = 0; i<petrolarray.length();i++) { 
          try{ 
          Log.d("debug", "Petrol Prices consists of: " + petrolarray.getJSONObject(i).getString("value")); 
          float prtl = Float.parseFloat(petrolarray.getJSONObject(i).getString("value")); 
          float dsl = Float.parseFloat(dieselarray.getJSONObject(i).getString("value")); 
          petrolPrices.add(new Entry(i,prtl)); 
          dieselPrices.add(new Entry(i,dsl)); 
          xMonths.add(categories.getJSONObject(i).getString("label")); 
          } catch (JSONException e){ 
          e.printStackTrace(); 
          //This is make sure that if some json data is wrongly formatted it then it should not influence other results. 
          } 
         } 
         processResult(petrolPrices); 
        } catch (JSONException e){ 
         e.printStackTrace(); 
        } 
       } 
      }, 

      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 

       } 
      }); 
    requestQueue.add(req); 

} 

И создайте функцию для обработки результата следующим образом.

private void processResult(Arraylist<Entry> petrolPrices) 
{ 

    ArrayList<ILineDataSet> lineDataSets= new ArrayList<>(); 

    LineDataSet lineDataSet1 = new LineDataSet(petrolPrices,"petrol"); 
    lineDataSets.add(lineDataSet1); 

    Log.d("debug","Size of PetrolPrices: " + petrolPrices.size()); 
    linechart.setData(new LineData(lineDataSets)); 
    linechart.setVisibleXRangeMaximum(12); 
} 
1

Это связано с асинхронным запросом, который вы делаете, чтобы получить данные JSON. Поскольку этот раздел кода должен ждать ответа сервера, он продолжается с кодом ниже блока запроса. Чтобы исправить это, просто перейдите внутрь функции запроса.

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.activity_device_report); 

     setContentView(R.layout.activity_fuel); 
     linechart = (LineChart) findViewById(R.id.lineChart); 

     requestQueue = Volley.newRequestQueue(this); 
     JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, url, 

       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         try{ 
          JSONArray dataset = response.getJSONArray("dataset"); 
          JSONObject petrol = dataset.getJSONObject(0); 
          JSONObject diesel = dataset.getJSONObject(1); 
          JSONArray categories = response.getJSONArray("categories"); 

          JSONArray petrolarray = petrol.getJSONArray("data"); 
          JSONArray dieselarray = diesel.getJSONArray("data"); 
          Log.d("debug","Size of PetrolArray: " + petrolarray.length()); 
          for(int i = 0; i<petrolarray.length();i++) { 
           Log.d("debug", "Petrol Prices consists of: " + petrolarray.getJSONObject(i).getString("value")); 
           float prtl = Float.parseFloat(petrolarray.getJSONObject(i).getString("value")); 
           float dsl = Float.parseFloat(dieselarray.getJSONObject(i).getString("value")); 
           petrolPrices.add(new Entry(i,prtl)); 
           dieselPrices.add(new Entry(i,dsl)); 
           xMonths.add(categories.getJSONObject(i).getString("label")); 
          } 

          ArrayList<ILineDataSet> lineDataSets= new ArrayList<>(); 

          LineDataSet lineDataSet1 = new LineDataSet(petrolPrices,"petrol"); 
          lineDataSets.add(lineDataSet1); 

          Log.d("debug","Size of PetrolPrices: " + petrolPrices.size()); 
          // linechart.setData(new LineData(lineDataSets)); 
          linechart.setVisibleXRangeMaximum(12); 
         } catch (JSONException e){ 
          e.printStackTrace(); 
         } 
        } 
       }, 

       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 
     requestQueue.add(req); 


    }