2016-03-06 3 views
0

Я пытаюсь сделать это приложение на Android, я получаю данные из API четырехклассников в формате JSON, и мне нужно проанализировать его, чтобы представить его в другом намерении. Я использую Android-библиотеку волейбола, чтобы получить JSON, но проблема в функции onResponse() JsonObjectRequest не имеет параметра return.so Я не могу получить объект JSON, полученный из url за пределами onResponse. Я не работал с залпом раньше и, следовательно, не знаю много об этом, любая помощь приветствуется. Вот код, который я пытаюсь заставить его работать.Как получить объект из внутреннего класса

Редактировать: Основная проблема, с которой я сталкиваюсь, заключается в том, что я не могу присвоить значение глобальной переменной в этом случае myPlaces внутри метода onResponse JsonObjectRequest. Или, если быть точным, то переменная присваивается внутри ничего не значит снаружи, таким образом, в последней строке

  Toast.makeText(MainActivity.this, myPlaces[2].getName(), Toast.LENGTH_LONG).show(); 

, когда я пытаюсь получить доступ к myPlaces [2] он дает мне исключения нулевого указателя.

Спасибо.

public void onClick(View v) { 

      RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this); 
      JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(urlString, null, new com.android.volley.Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 

        try { 
         JSONObject meta = response.getJSONObject("meta"); 
         String status = meta.getString("code"); 
         Toast.makeText(MainActivity.this, status, Toast.LENGTH_SHORT).show(); 


         if(status.equals("200")) 
         { 
          JSONObject responseJson = response.getJSONObject("response"); 
          JSONArray venues = responseJson.getJSONArray("venues"); 
          Places[] tempPlaces = new Places[venues.length()]; 
          for (int i = 0 ; i < venues.length(); i++) 
          { 
           Places place = new Places(); 
           JSONObject venueObject = venues.getJSONObject(i); 
           place.setName(venueObject.getString("name")); 
           JSONObject locatVenue = venueObject.getJSONObject("location"); 
           place.setLat(locatVenue.getDouble("lat")); 
           place.setLon(locatVenue.getDouble("lng")); 
           tempPlaces[i] = place; 
          } 

          Toast.makeText(MainActivity.this, tempPlaces[2].getName(), Toast.LENGTH_LONG).show(); 
          myPlaces = tempPlaces; 
         } 

         else 
         { 
          Toast.makeText(MainActivity.this, "No response from API", Toast.LENGTH_LONG).show(); 
         } 


        } catch (JSONException e) { 
         e.printStackTrace(); 
         Toast.makeText(MainActivity.this, "There is some error here", Toast.LENGTH_LONG).show(); 
        } 

       } 
      }, new com.android.volley.Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Toast.makeText(MainActivity.this, "There has been some error", Toast.LENGTH_LONG).show(); 
       } 
      }); 

      requestQueue.add(jsonObjectRequest); 
      Toast.makeText(MainActivity.this, myPlaces[2].getName(), Toast.LENGTH_LONG).show(); 
+0

Возможный дубликат [с использованием внутреннего объекта класса во внешнем классе java] (http://stackoverflow.com/questions/18292824/using-inner-class-object-in-outer-class-java) – pczeus

ответ

1

Волейбол сам по себе не является внутренним классом; ответ - анонимный класс.

Вам не нужен возврат в Volley, вы просто используете переменные, которые уже определены в вашем классе.

Я принимаю myPlaces - это поле в вашем классе? В противном случае, я не знаю, где она объявлена ​​вне OnClick ..

Эта строка присваивает myPlaces и выглядит, как он будет работать нормально

myPlaces = tempPlaces; 

Вы можете определить метод в классе, чтобы разобрать все JSONObject вместо того, чтобы возвращаться из Volley. Это просто передает логику другому методу, поэтому вам не нужно думать о «возвращении» внутри Volley.

public void parseJSON(JsonObject object) 

И передать response от залпа в том, что и делать свою обычную синтаксический анализ и назначение переменной, и вы можете Тост myPlaces внутри этого метода.

Кроме того, обратите внимание, что Volley асинхронный, то есть вы не гарантированы немедленный результат, так

Toast.makeText(MainActivity.this, myPlaces[2].getName(), Toast.LENGTH_LONG).show(); 

бы, вероятно, бросили либо NullPointerException или IndexOutOfBoundsException, потому что myPlaces был либо необъявленной или пустым, прежде чем запрос Volley , Я говорю это потому, что он не представляется перед запросом Volley.

+0

О, это было действительно , полезно. теперь я чувствую себя глупо, не думая о создании метода и просто проходящем вниз объект. Благодарю. Надеюсь, это поможет другим людям. – Astronautilus

+0

Ваша основная проблема заключается в том, что залп асинхронен, поэтому вы получаете исключение NullPointerException –

Смежные вопросы