2016-11-24 99 views
0

我用一个方法来从服务器中抽出我的json对象。接收我的对象的部分工作正常,我得到我的回应,并尝试将我的值放入linkedhashmap。当我尝试返回我的地图时,我收到空我不能从方法返回一个LinkedHashMap,我得到空

我的方法是这样的:

public static LinkedHashMap<String,ArrayList<String>> GetBusinessInCategories() 

我宣布我的LinkedHashMap的方法外,如:

final static LinkedHashMap<String,ArrayList<String>> myMap = new LinkedHashMap<String,ArrayList<String>>(); 


public static LinkedHashMap<String,ArrayList<String>> GetBusinessInCategories() { 
    String tag_string_req = "req_register"; 
    //final LinkedHashMap<String,ArrayList<String>> myMap = new LinkedHashMap<String,ArrayList<String>>(); 
    //showDialog(); 

    // prepare the Request 
    StringRequest getRequest = new StringRequest(Request.Method.GET, URL_GET_BUSINESS_CATS, new Response.Listener<String>() 
    { 
       @Override 
       public void onResponse(String response) 
       { 
        String MyResponse = fixEncodingUnicode(response); 
        JSONObject j = null; 
        JSONArray result; 

        ArrayList listData = new ArrayList<String>(); 
        ArrayList NewlistData = new ArrayList<String>(); 

        try { 
         j = new JSONObject(MyResponse); 

         JSONArray jarray = j.getJSONArray("List"); 
         for (int hk = 0; hk < jarray.length(); hk++) { 
          JSONObject d = jarray.getJSONObject(hk); 
          // Adding Header data 
          JSONObject obj_cat = d.getJSONObject("Category"); 
          JSONObject obj_bus = d.getJSONObject("Business"); 
          String myKey = obj_cat.getString("cat_id"); 
          String myVal = obj_bus.getString("Name"); 

          if(myMap.containsKey(myKey)) 
          { 
           listData.add(myVal); 
           ArrayList MergeNewlistData = new ArrayList<String>(); 
           MergeNewlistData.addAll(listData); 
           MergeNewlistData.addAll(NewlistData); 
           myMap.put(myKey,MergeNewlistData); 

          }else 
          { 
            NewlistData = new ArrayList<String>(); 
            NewlistData.add(myVal); 
            myMap.put(myKey,NewlistData); 
          } 

         } 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

        // display response 
        //Log.d("Response", mympap.toString()); 
        // display response 
        Log.d("Response", MyResponse.toString()); 

       } 
      }, 
      new Response.ErrorListener() 
      { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e("Error", "Registration Error: " + error.getMessage()); 
        Toast.makeText(context, error.getMessage(), Toast.LENGTH_LONG).show(); 
       } 
      } 
    ); 
    // Adding request to request queue 
    AppController.getInstance().addToRequestQueue(getRequest, tag_string_req); 
    return myMap; 

} 

我在做什么错在这里?

+0

您可以显示完整的代码吗? –

+0

您的代码在使用异步回调方面的流程不正确。 onResponse(),onError()这些在实例化StringRequest对象时不会被调用。所以,当你调用GetBusinessInCategories()时,它只是设置像onResponse()这样的回调方法。这并不意味着它被执行,并且你的myMap已经更新。只要响应异步返回,您的地图对象将被更新。但是,您的GetBusinessInCategories()方法返回(同步)一个空映射对象。所以,我建议你在响应到达onResponse()回调后采取行动 –

+0

好的解释,但它对我来说很模糊,我很新手,你的意思是在onResponse回调后创建myMap? – NoviceUser

回答

0

当我尝试返回我的地图时,我得到空。我在这里做错了什么?

你不能让你的方法返回地图。只要使其无效。

如果您需要使用该映射,请声明一个将其作为参数接受的方法,在Volley侦听器中onResponse的最后传递该映射,然后继续在该新方法中构建适配器等。 。

。这样你应该使用异步方法 - 换句话说,你要空立即返回,而排球代码是关闭后台做别的事情

+0

一个简单的方法,如公共LinkedHashMap MyMethod(LinkedHashMap map){返回地图;}这样的事情? – NoviceUser

+0

Um no。就像使用map参数构建适配器一样。将所述适配器设置为一个listView。你通常会做的事情,如果你能够像你写的那样返回这张地图。 –

+0

我已经有了可扩展列表视图的适配器,所以你的意思是使用它来设置我的排列方法里面的列表视图?,如果你可以提供一个例子,请! – NoviceUser

相关问题