我正在开发一个使用解析服务器的项目。它像tinder一样工作,允许用户下载和显示附近其他用户的名字和图像。
它有效,接受一个错误,当应用程序显示时,名称和图像无法正确匹配。
该应用程序最初下载并创建一组本地用户,这很好。
然后我使用以下代码下载他们的图像:
ParseQuery<ParseUser> query = ParseUser.getQuery();
query.whereWithinKilometers("location", parseCustLocation, searchRadius);
query.findInBackground(new FindCallback<ParseUser>() {
@Override
public void done(final List<ParseUser> objects, ParseException e) {
if (e==null){
Log.d("state", "215 query successful");
if (objects.size()>0) {
for (final ParseUser user : objects){
Log.d("state", "231"+user.getUsername());
//TextView text = (TextView) findViewById(R.id.Name);
Users.add(user);
sUsers.add((String) user.get("Name"));
locations.add((ParseGeoPoint) user.get("location"));
parseFiles.add((ParseFile) user.get("image"));
}
for (ParseFile file : parseFiles) {
file.getDataInBackground(new GetDataCallback() {
@Override
public void done(byte[] data, ParseException e) {
if (e==null){
Log.d("state", "174 we've got data");
Bitmap bmp = BitmapFactory.decodeByteArray(data,0,data.length);
bitmaps.add(bmp);
if (sUsers.size()==bitmaps.size()){
swipeAdapter.updateData(sUsers,bitmaps);
}
}
}
});}
据我所知,我认为问题在于
Bitmap bmp = BitmapFactory.decodeByteArray(data,0,data.length);
bitmaps.add(bmp);
例如,当我运行调试器时,我有两个数组如下(bitmapFactory似乎将位图放在位图[]的任何部分中):
sUsers[0] = "Billy",
sUsers[1] = "Sarah",
sUsers[2] = "Jim",
bitmaps[0] = Sarahs image,
bitmaps[1] = Jims image,
bitmaps[2] = Billys image
显然我需要
bitmaps[0] = Billys image,
bitmaps[1] = Sarahs image,
bitmaps[2] = Jims image,
注意: 如果我使用调试器逐步运行应用程序,则位图似乎处于正确的顺序。
答案 0 :(得分:0)
file.getDataInBackground是异步回调,因此检索到的第一个数据将首先添加到位图数组中,
您可以使用Hashmap,每个键都是用户objectId,键是用户数据。
Map<String, data> map = new HashMap<String, data>(); // your Hashmap
答案 1 :(得分:0)
感谢Julien,我设法让它正常工作,但是使用大量嵌套异步任务进行了非常粗略的解决方法:
parseFiles.get(0).getDataInBackground(new GetDataCallback() {
@Override
public void done(byte[] data, ParseException e) {
if (e==null){
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
bitmaps.add(0, bmp);
parseFiles.get(1).getDataInBackground(new GetDataCallback() {
@Override
public void done(byte[] data, ParseException e) {
if (e==null){
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
bitmaps.add(1, bmp);
parseFiles.get(2).getDataInBackground(new GetDataCallback() {
@Override
public void done(byte[] data, ParseException e) {
if (e==null){
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
bitmaps.add(2, bmp);
parseFiles.get(3).getDataInBackground(new GetDataCallback() {
@Override
public void done(byte[] data, ParseException e) {
if (e==null){
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
bitmaps.add(3, bmp);
parseFiles.get(4).getDataInBackground(new GetDataCallback() {
@Override
public void done(byte[] data, ParseException e) {
if (e==null){
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
bitmaps.add(4, bmp);
parseFiles.get(5).getDataInBackground(new GetDataCallback() {
@Override
public void done(byte[] data, ParseException e) {
if (e==null){
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
//bitmaps.add(bmp);
bitmaps.add(5, bmp);
if (sVenueUsers.size()==bitmaps.size()){
swipeAdapter.updateData(sUsers, bitmaps);
}
}
}
});
}
}
});
}
}
});
}
}
});
}
}
});
}
}
});
我尝试了你的Hashmap想法,但得到的消息是数据是一个无法识别的类。我稍后会尝试一下。