2016-11-24 18 views
0

サーバーからvolley my jsonオブジェクトを取得する方法を使用します。私のオブジェクトを受け取る部分は正常に動作し、私は応答を得て、リンクされたハッシュマップに自分の値を入れようとします。 私の地図を返そうとすると、私はnullを取得します。メソッドからLinkedHashMapを返すことができず、nullが返される

私の方法は次のようにされています。私はここで間違って何をやっている

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; 

} 

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

私は法の外に私のLinkedHashMapを宣言するように?

+0

は、あなたが完全なコードをしてください示しできるNULLすぐに返さ取得していますか? –

+0

あなたのコードは、非同期コールバックを扱うための流れが間違っています。 onResponse()、onError()これらはStringRequestオブジェクトをインスタンス化するときに呼び出されません。したがって、GetBusinessInCategories()を呼び出すと、onResponse()のようなコールバックメソッドが設定されます。それが実行され、myMapが更新されたことを意味するものではありません。レスポンスが非同期に戻ると、マップオブジェクトが更新されます。しかし、GetBusinessInCategories()メソッドは空のマップオブジェクトを(同期的に)返しました。だから、応答がonResponse()コールバックに到着した後に行動を取ることをお勧めします。 –

+0

よく分かりやすい説明ですが、かなりぼやけていて、私はかなり初心者です。あなたはonResponseコールバックの後にmyMapを作成するつもりですか? – NoviceUser

答えて

0

マップを返そうとするとnullになります。私はここで間違っていますか?

メソッドをマップに戻すことはできません。ちょうどそれを無効にしてください。

マップを使用する必要がある場合は、それをパラメータとして受け入れるメソッドを宣言し、Volleyリスナー内のonResponseの最後にマップを渡して、その新しいメソッド内でアダプタを構築します。どのように非同期メソッドを使用することになっています

- バレーボールコードはバックグラウンドで何かをやってでオフになっている間に、他の言葉で、あなたは

+0

public LinkedHashMap MyMethod(LinkedHashMap map){return map;}のような単純なメソッドはこうですか? – NoviceUser

+0

mapパラメータを使ってアダプタを構築する。アダプタをlistViewに設定します。あなたが書いたようにこの地図を返すことができれば、通常はやっていること。 –

+0

私はすでに展開可能なリストビューのアダプターを持っていますので、私のボレーメソッド内でリストビューを設定することを意味していますか? – NoviceUser

関連する問題