2016-11-24 93 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

相關問題