基本上每个单元格有三个后台作业+一个云代码作业。查找商品图片,查找卖家,查找卖家个人资料图片,并检查当前用户是否还喜欢该商品。
在编写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) 其次,如果以上是正确的,有什么办法可以提高性能吗?我编码得当吗? 非常感谢你的时间!
答案 0 :(得分:0)
我找到了答案。应用程序因内存问题而崩溃。我正在将许多图像加载到gridView中。 我找到了一些方法来解决这个问题。基本上需要两个步骤。 首先,启动一个进程对话框,在doInBackground方法中下载数据。 下载后,将其兑现到内存或磁盘上。 这是怎么做的。 http://www.androidbegin.com/tutorial/android-parse-com-gridview-tutorial/ 我复制了大部分代码,并修改了一下以适应我的Parse Data。但那些内存缓存和存储确实很有帮助。