Android排球请求响应不按顺序

Ash*_*aid 1 android android-volley android-json

我正在制作多个Volley StringRequests.

requestfriendlist方法获取与"火影忍者"的配置文件列表.该requestimagelink方法获取的每个配置文件在它前面的方法result.However我收到效应初探(ImageLink的)不是从订单拿到图片requestimagelink方法不是为了.

例如 -

请求[1,2,3,4]

回复[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);
}
Run Code Online (Sandbox Code Playgroud)

Afs*_*hin 6

以下是使用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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

希望这可以帮助.