Android Volley 请求响应不按顺序

标签 android android-volley android-json

我正在制作多个 Volley StringRequests。

requestfriendlist 方法获取与“火影忍者”相关的配置文件列表。 requestimagelink 方法为它在前一个方法结果中获得的每个配置文件获取图像。但是我得到的响应(图像链接)不是按顺序从 requestimagelink 方法不在订单。

例如-

请求[1,2,3,4]

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

请帮我解决这个问题。

附加代码 fragment

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 Volley 请求响应不按顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33986392/

相关文章:

java - 在不下载 opencv sdk 管理器的情况下使用 android opencv 应用程序

Android - Volley 无法将我的参数发送到服务器

Android volley 错误 : "Trust anchor for certification path not found", 仅在真实设备中,而不是模拟器

android - 如何在android中的 ImageView 上设置图像路径

java - 解析 JSON 数据时出现异常

android - 如何暂时禁用 map 标记聚类?

android - android中的动态gridview分隔符

Java If 循环点击次数过多而无法重置

android-volley - 用于 Android 解析 xml 响应的 Volley 库?