我正在制作多个Volley StringRequests。
requestfriendlist 方法提取与“Naruto”相关的个人资料列表。 requestimagelink 方法为先前方法结果中获得的每个配置文件提取图像。但是,我得到的响应(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);
}
答案 0 :(得分: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);
}
请记住,在您的arrayAdapter的getView(...)方法中,您必须直接从profile_img_Hash
加载配置文件的图像,其中配置文件名称为关键字,如下所示:
ImageClass img = profile_img_Hash.get(profilename);
if(img != null){
//row's imageView.setBitmap(img.getBitmap());
}
希望这有帮助。