从Parse

时间:2017-08-07 15:54:45

标签: image parse-platform bitmap bitmapfactory

我正在开发一个使用解析服务器的项目。它像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,  

注意: 如果我使用调试器逐步运行应用程序,则位图似乎处于正确的顺序。

2 个答案:

答案 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想法,但得到的消息是数据是一个无法识别的类。我稍后会尝试一下。