2017-08-07 85 views
0

我正在使用解析服务器的项目。它像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); 

,例如,当我运行调试器我有两个阵列如下(位图工厂似乎把位图的任何部分位图[]):

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

file.getDataInBackground是一个异步回调,因此检索到的将是第一个加入的位图阵列的第一个数据,

您可以使用哈希映射每个键会在用户OBJECTID和关键用户的数据。

Map<String, data> map = new HashMap<String, data>(); // your Hashmap 
0

感谢朱利安,我设法得到它正常工作,但使用大量的嵌套的异步任务的一种非常原始的解决方法:

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的想法,但得到了数据的消息一个无法识别的类。我会尝试以后再做。