2016-03-06 69 views
0

我想在Android中创建此应用程序,我从JSON格式的foursquare API获取数据,并且需要解析它以将其呈现在另一个意图中。 我正在使用Android的排球库来获取JSON,但问题是JsonObjectRequest的onResponse()函数没有返回参数。因此,我无法从onResponse之外的url获取JSON对象。 我之前没有和凌云一起工作过,因此对它不了解太多,任何帮助都不胜感激。这是我试图使其工作的代码。如何从内部类中获取对象

编辑:我面临的主要问题是,我不能在这种情况下为JsonObjectRequest的onResponse方法中的myPlaces赋值全局变量。或者准确的说,里面赋值的变量没什么意思之外,从而在最后一行

  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该方法内。

另外请注意,排球是异步的,这意味着你不能保证一个直接的结果,所以

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

可能会纷纷抛出任何一个NullPointerException或IndexOutOfBoundsException异常,因为myPlaces是凌空请求之前或者未申报或空。我之所以这样说,是因为它在Volley请求之前似乎没有被分配。

+0

哦,这是真的,有帮助。现在我感到很蠢,因为没有考虑创建方法,只是传递对象。谢谢。希望这有助于其他人。 – Astronautilus

+0

你的主要问题是凌乱是异步的,所以你得到一个NullPointerException –