我正在制作多个Volley StringRequests。

requestfriendlist方法获取与“ Naruto”相关的配置文件列表。 requestimagelink方法为在先前方法结果中获得的每个配置文件获取图像。但是,我收到的响应(imagelink)是不正确的,而requestimagelink方法是不正确的。

例如 -

请求[1,2,3,4]

Response [2,1,4,3]或任何其他顺序。

请帮助我解决此问题。

附加代码段

protected void onCreate (Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView) findViewById(R.id.list);
    adapter = new CustomImageAdapter(this, imageList);
    listView.setAdapter(adapter);

    requestfriendlist("Naruto");
}
private void requestfriendlist (String profilename)
{
    String uri = String.format(Config.URL_REQUEST_FRIENDS + "?current_user=%1$s", profilename);
    Log.d(TAG + "uri", uri);
    StringRequest strReq = new StringRequest(
            Request.Method.GET,
            uri,
            new Response.Listener<String>()
            {
                @Override
                public void onResponse (String response)
                {
                    try
                    {
                        JSONObject responseObj = new JSONObject(response);
                        Log.d(TAG + "friends", response);
                        JSONArray jResult = responseObj.getJSONArray("req_users");
                        Toast.makeText(MainActivity.this, jResult.toString(), Toast.LENGTH_SHORT).show();
                        for(int i = 0; i < jResult.length(); i++)
                        {
                            JSONObject jresponse = jResult.getJSONObject(i);
                            String profile = jresponse.getString("userid");
                            friendlist.add(profile);
                        }
                        for(int i = 0; i < friendlist.size(); i++)
                            requestimagelink(friendlist.get(i));
                    }
                    catch(JSONException e)
                    {
                        Log.d(TAG, "error" + e.getMessage());
                        Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                    }
                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse (VolleyError error)
                {
                    Log.e(TAG, "Error: " + error.getMessage());
                    Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
    );
    MyApplication.getInstance().addToRequestQueue(strReq);
}

private void requestimagelink (final String profilename)
{
    String uri = String.format(Config.URL_REQUEST_IMAGE + "?userid=%1$s", profilename);
    Toast.makeText(MainActivity.this, uri, Toast.LENGTH_SHORT).show();
    Log.d(TAG, "uri" + uri);
    StringRequest strReq = new StringRequest(
            Request.Method.GET,
            uri,
            new Response.Listener<String>()
            {
                //response from the server
                @Override
                public void onResponse (String response)
                {
                    try
                    {
                        JSONObject responseObj = new JSONObject(response);
                        ((TextView) findViewById(R.id.tvprofilejson)).setText(response);
                        Log.d(TAG, response);
                        JSONArray jResult = responseObj.getJSONArray("photos");
                        for(int i = 0; i < jResult.length(); i++)
                        {
                            JSONObject jresponse = jResult.getJSONObject(i);
                            ImageClass img = new ImageClass();
                            img.setThumbnailUrl(jresponse.getString("name"));
                            img.setTitle(profilename);
                            imageList.add(img);
                            //imagelinks.add(jresponse.getString("name"));
                            adapter.notifyDataSetChanged();
                        }
                    }
                    catch(JSONException e)
                    {
                        Log.d(TAG, "error" + e.getMessage());
                        Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                    }
                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse (VolleyError error)
                {
                    Log.e(TAG, "Error: " + error.getMessage());
                    Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
    );
    // Adding request to request queue
    MyApplication.getInstance().addToRequestQueue(strReq);
}

最佳答案

这是使用hashMap将个人资料链接到其图像的方法:

    ArrayList<String> friendlist = new ArrayList<String>();

/**
    Keeps the profiles' images. Later in your arrayAdapter, where you want show thumbnail image, you must
    get corresponding ImageClass from of profile with profileName. If the result is null means that the image
    is not loaded yet, otherwise you can use the ImageClass object to retreive profile's image.
*/
HashMap<String, ImageClass> profile_img_Hash = new HashMap<String, ImageClass>();

protected void onCreate (Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView) findViewById(R.id.list);
    adapter = new CustomImageAdapter(this, imageList);
    listView.setAdapter(adapter);

    requestfriendlist("Naruto");
}
private void requestfriendlist (String profilename)
{
    String uri = String.format(Config.URL_REQUEST_FRIENDS + "?current_user=%1$s", profilename);
    Log.d(TAG + "uri", uri);
    StringRequest strReq = new StringRequest(
            Request.Method.GET,
            uri,
            new Response.Listener<String>()
            {
                @Override
                public void onResponse (String response)
                {
                    try
                    {
                        JSONObject responseObj = new JSONObject(response);
                        Log.d(TAG + "friends", response);
                        JSONArray jResult = responseObj.getJSONArray("req_users");
                        Toast.makeText(MainActivity.this, jResult.toString(), Toast.LENGTH_SHORT).show();
                        for(int i = 0; i < jResult.length(); i++)
                        {
                            JSONObject jresponse = jResult.getJSONObject(i);
                            String profile = jresponse.getString("userid");
                            friendlist.add(profile);
                        }
                        for(int i = 0; i < friendlist.size(); i++)
                            requestimagelink(friendlist.get(i));

                    }
                    catch(JSONException e)
                    {
                        Log.d(TAG, "error" + e.getMessage());
                        Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                    }
                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse (VolleyError error)
                {
                    Log.e(TAG, "Error: " + error.getMessage());
                    Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
    );
    MyApplication.getInstance().addToRequestQueue(strReq);
}

private void requestimagelink (final String profilename)
{

    //This snippet will prevent re-downloading
    if(profile_img_Hash.get(profilename) != null) {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                adapter.notifyDataSetChanged(); //Optional. Not neccessary..!
            }
        });
        return; //Because this profile's image is loaded.
    }


    String uri = String.format(Config.URL_REQUEST_IMAGE + "?userid=%1$s", profilename);
    Toast.makeText(MainActivity.this, uri, Toast.LENGTH_SHORT).show();
    Log.d(TAG, "uri" + uri);
    StringRequest strReq = new StringRequest(
            Request.Method.GET,
            uri,
            new Response.Listener<String>()
            {
                //response from the server
                @Override
                public void onResponse (String response)
                {
                    try
                    {
                        JSONObject responseObj = new JSONObject(response);
                        ((TextView) findViewById(R.id.tvprofilejson)).setText(response);
                        Log.d(TAG, response);
                        JSONArray jResult = responseObj.getJSONArray("photos");
                        for(int i = 0; i < jResult.length(); i++)
                        {
                            JSONObject jresponse = jResult.getJSONObject(i);
                            ImageClass img = new ImageClass();
                            img.setThumbnailUrl(jresponse.getString("name"));
                            img.setTitle(profilename);
                            imageList.add(img);
                            //imagelinks.add(jresponse.getString("name"));

                            //Before notifying the adapter we have to put the img into our hash map.
                            profile_img_Hash.put(profilename, img);

                            //Remember, in you getView(..) method of your adapter, you have to get image from
                            // profile_img_Hash by profileName as key. If the returned result was null do nothing
                            // If the returned value was not null you can use the ImageClass to provide profile's
                            // image. :)
                            adapter.notifyDataSetChanged();
                        }
                    }
                    catch(JSONException e)
                    {
                        Log.d(TAG, "error" + e.getMessage());
                        Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                    }


                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse (VolleyError error)
                {
                    Log.e(TAG, "Error: " + error.getMessage());
                    Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
                }

            }
    );
    // Adding request to request queue
    MyApplication.getInstance().addToRequestQueue(strReq);
}


请记住,在arrayAdapter的getView(...)方法中,您必须直接从profile_img_Hash加载配置文件的映像,配置文件名称为键,如下所示:

ImageClass img = profile_img_Hash.get(profilename);
if(img != null){
   //row's imageView.setBitmap(img.getBitmap());
}


希望这可以帮助。

关于android - Android Volley请求响应不正常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33986392/

10-11 00:08