Parse.com多个后台作业,性能问题

时间:2014-08-01 13:54:33

标签: android ios parse-platform

杰克在这里。我正在开发一个应用程序,我希望在iOS中的collectionView和Android中的网格视图中显示一些项目。我希望显示商品的图片,名称,价格,然后显示卖家的个人资料图片,名称和上次登录。

基本上每个单元格有三个后台作业+一个云代码作业。查找商品图片,查找卖家,查找卖家个人资料图片,并检查当前用户是否还喜欢该商品。

在编写iOS应用程序时,代码工作正常。以下是我的cellForItemAtIndexPath方法

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    //Initing an iKard
    itemCell *cell = (itemCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"itemCell" forIndexPath:indexPath];

    [cell.activityIndicator startAnimating];

    PFObject *item = [self.itemArray objectAtIndex:indexPath.row];

    cell.objectId = [item objectId];

    [cell.itemNameLabel setText:[item objectForKey:@"name"]];
    float priceInCent = [[item objectForKey:@"priceInCent"] floatValue];
    float price = priceInCent/100.0f;
    [cell.itemPriceLabel setText:[NSString stringWithFormat:@"$%.02f", price]];
    PFFile *imageFile = [item objectForKey:@"itemImage"];
    if (imageFile != nil) {
        [imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
            if (!error) {
                UIImage *image = [UIImage imageWithData:data];
                [cell.itemImageView setImage:image];
            } else {
                [self displayErrorMessage:error];
            }
        }];
    }

    [PFCloud callFunctionInBackground:@"userLikedItemWithId"
                       withParameters:@{@"objectId":[item objectId]}
                                block:^(NSNumber *liked, NSError *error) {
                                    if ([liked isEqualToNumber:[NSNumber numberWithInt:0]]) {
                                        [cell.likeButton setBackgroundImage:[UIImage imageNamed:@"like0"]
                                                                   forState:UIControlStateNormal];
                                    } else if ([liked isEqualToNumber:[NSNumber numberWithInt:1]]) {
                                        [cell.likeButton setBackgroundImage:[UIImage imageNamed:@"like1"]
                                                                   forState:UIControlStateNormal];
                                    }
                                }];



    PFUser *seller = [item objectForKey:@"owner"];
    [seller fetchInBackgroundWithBlock:^(PFObject *seller, NSError *error) {
        if (!error) {

            //Setting seller info
            //Name
            [cell.profileNameLabel setText: [seller objectForKey:@"displayName"]];

            //Last visit
            NSString *lastVisit = [NSString new];
            NSDate *updatedAt = seller.updatedAt;
            NSDate *now = [NSDate date];
            NSInteger differenceInDays = [self daysBetweenDate:updatedAt
                                                        andDate:now];
            if (differenceInDays == 0) {
                lastVisit = @"Today";
            } else {
                lastVisit = [NSString stringWithFormat:@"%ld days ago", (long)differenceInDays];
            }
            [cell.profileLastVisitLabel setText:lastVisit];

            //Profile image
            PFFile *imageFile = [seller objectForKey:@"profileImage"];
            if (imageFile != nil) {
                [imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
                    if (!error) {
                        UIImage *image = [UIImage imageWithData:data];
                        [cell.profileImageView setImage:image];
                        [cell.activityIndicator stopAnimating];
                    } else {
                        [self displayErrorMessage:error];
                    }
                }];
            }
        } else {
            [self displayErrorMessage:error];
        }
    }];

    return cell;
}

然而,当我非常复制粘贴然后将object-C转换为Java时,事情开始变得混乱。 Android真实设备下载文件所需的时间比在iOS真实设备上运行时要长得多。由于我有四个后台工作正在进行,所以即使下载和显示一个项目也需要很长时间。如果我开始滚动,单元格就会搞砸了。 以下是gridView适配器中的getView方法。

@Override
    public View getView(int position, View cell, ViewGroup viewGroup) {

        LayoutInflater inflater = ((Activity) this.mContext).getLayoutInflater();
        cell = inflater.inflate(R.layout.item_cell, viewGroup, false);

//        [cell.activityIndicator startAnimating];

ParseObject item = this.itemList.get(position);

//        cell.objectId = [item objectId];

        TextView itemNameTextView = (TextView) cell.findViewById(R.id.itemNameTextView);
        itemNameTextView.setText(item.getString("name"));

        float priceInCent = item.getLong("priceInCent");
        float price = priceInCent/100.0f;
        String P= "$" + Float.toString(price);
        TextView itemPriceTextView = (TextView) cell.findViewById(R.id.itemPriceTextView);
        itemPriceTextView.setText(P);

        final ImageView itemImageView = (ImageView) cell.findViewById(R.id.itemImageView);
        ParseFile imageFile = item.getParseFile("itemImage");
        imageFile.getDataInBackground(new GetDataCallback() {
          public void done(byte[] data, ParseException e) {
            if (e == null) {
              // data has the bytes for the resume
                Bitmap image = BitmapFactory.decodeByteArray(data,0,data.length);
                itemImageView.setImageBitmap(image);
            } else {
              // something went wrong
                displayErrorMessage(e);
            }
          }
        });

        HashMap<String, Object> params = new HashMap<String, Object>();
        params.put("objectId", item.getObjectId());
        ParseCloud.callFunctionInBackground("userLikedItemWithId", params, new FunctionCallback<Integer>() {
            @Override
            public void done(Integer liked, ParseException e) {
                if (e != null) {
                    displayErrorMessage(e);
                    return;
                }
                if (liked == 0) {

                } else if (liked == 1) {

                }
            }
        });


        final TextView profileNameTextView = (TextView) cell.findViewById(R.id.profileNameTextView);
        final TextView profileLastVisitTextView = (TextView) cell.findViewById(R.id.profileLastVisitTextView);
        final ImageView profileImageView = (ImageView) cell.findViewById(R.id.profileImageView);

        ParseUser seller = item.getParseUser("owner");
        seller.fetchInBackground(new GetCallback<ParseObject>() {
              public void done(ParseObject seller, ParseException e) {
                if (e == null) {
                    //Setting seller info
                    //Name
                    profileNameTextView.setText(seller.getString("displayName"));
                    //Last visit
                    Date lastVisit = seller.getUpdatedAt();
                    Date now = new Date();
                    long diff = now.getTime() - lastVisit.getTime();
                    int diffInDays = (int) (diff / (1000 * 60 * 60 * 24));
                    String lastVisited= Float.toString(diffInDays);
                    profileLastVisitTextView.setText(lastVisited);

                    if (diffInDays == 0) {
                        profileLastVisitTextView.setText("Today");
                    } else {
                        profileLastVisitTextView.setText(lastVisited + "days ago");
                    }


                    //Profile image
                    ParseFile imageFile = seller.getParseFile("profileImage");
                    imageFile.getDataInBackground(new GetDataCallback() {
                      public void done(byte[] data, ParseException e) {
                        if (e == null) {
                          // data has the bytes for the resume
                            Bitmap image = BitmapFactory.decodeByteArray(data,0,data.length);
                            profileImageView.setImageBitmap(image);
                        } else {
                          // something went wrong
                            displayErrorMessage(e);
                        }
                      }
                    });
                } else {
                    displayErrorMessage(e);
                }
              }
            });

        return cell;
    }

事情变得更糟,因为Android倾向于为单个单元格多次调用getView。滚动一点后,应用程序因为背景作业太多而崩溃。

我的问题是, 首先,Android真实设备和iOS真实设备的性能差异造成的差异是什么? (这是一个新的机器人,2g内存,4核心,为了未来的证据而购买,vs 2岁的iPhone 4s) 其次,如果以上是正确的,有什么办法可以提高性能吗?我编码得当吗? 非常感谢你的时间!

1 个答案:

答案 0 :(得分:0)

我找到了答案。应用程序因内存问题而崩溃。我正在将许多图像加载到gridView中。 我找到了一些方法来解决这个问题。基本上需要两个步骤。 首先,启动一个进程对话框,在doInBackground方法中下载数据。 下载后,将其兑现到内存或磁盘上。 这是怎么做的。 http://www.androidbegin.com/tutorial/android-parse-com-gridview-tutorial/ 我复制了大部分代码,并修改了一下以适应我的Parse Data。但那些内存缓存和存储确实很有帮助。