Android Parse.com多个后台作业,性能问题
我是杰克。我正在开发一个应用程序,我希望在iOS的collectionView和Android的grid view中显示一些项目。我希望显示商品的图像、名称、价格,然后显示卖家的配置文件图像、名称和上次登录 基本上每个单元有三个后台作业+一个云代码作业。查找项目图像、查找卖家、查找卖家配置文件图像,并检查当前用户是否喜欢该项目 在编写iOS应用程序时,代码运行正常。下面是我的cellForItemAtIndexPath方法Android Parse.com多个后台作业,性能问题,android,ios,parse-platform,Android,Ios,Parse Platform,我是杰克。我正在开发一个应用程序,我希望在iOS的collectionView和Android的grid view中显示一些项目。我希望显示商品的图像、名称、价格,然后显示卖家的配置文件图像、名称和上次登录 基本上每个单元有三个后台作业+一个云代码作业。查找项目图像、查找卖家、查找卖家配置文件图像,并检查当前用户是否喜欢该项目 在编写iOS应用程序时,代码运行正常。下面是我的cellForItemAtIndexPath方法 - (UICollectionViewCell *)collection
- (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 real设备下载文件所需的时间比在iOS real设备上运行要长得多。由于我有四个后台工作,所以即使下载和显示一个项目也需要很长时间。如果我开始滚动,单元格就会乱七八糟。
以下是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;
}
@覆盖
公共视图getView(int位置、视图单元格、视图组视图组){
LayoutFlater充气器=((活动)this.mContext.getLayoutFlater();
单元格=充气器。充气(R.layout.item_单元格,视图组,false);
//[cell.activityIndicator startAnimating];
ParseObject item=this.itemList.get(位置);
//cell.objectId=[item objectId];
TextView itemNameTextView=(TextView)cell.findViewById(R.id.itemNameTextView);
itemNameTextView.setText(item.getString(“名称”));
浮动价格激励=item.getLong(“价格激励”);
浮动价格=价格激励/100.0f;
字符串P=“$”+Float.toString(价格);
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”);
getDataInBackground(新的GetDataCallback(){
公共无效完成(字节[]数据,解析异常e){
如果(e==null){
//数据包含用于恢复的字节数
位图图像=位图工厂.decodeByteArray(数据,0,数据.length);
itemImageView.setImageBitmap(图像);
}否则{
//出了点问题
显示错误信息(e);
}
}
});
HashMap params=新的HashMap();
参数put(“objectId”,item.getObjectId());
ParseCloud.callFunctionInBackground(“userLikedItemWithId”,参数,新函数callback(){
@凌驾
public void done(类似整数,parsee异常){
如果(e!=null){
显示错误信息(e);
回来
}
if(liked==0){
}else if(liked==1){
}
}
});
final TextView profileNameTextView=(TextView)cell.findViewById(R.id.profileNameTextView);
最终文本视图配置文件LastVisiteTextView=(文本视图)cell.findViewById(R.id.profileLastVisiteTextView);
final ImageView profileImageView=(ImageView)cell.findViewById(R.id.profileImageView);
ParseUser seller=item.getParseUser(“所有者”);
seller.fetchInBackground(新的GetCallback(){
公共无效完成(ParseObject卖家,Parsee异常){
如果(e==null){
//设置卖家信息
//名字
profileNameTextView.setText(seller.getString(“displayName”));
//最后一次访问
Date lastVisite=seller.getUpdatedAt();
现在日期=新日期();
long diff=now.getTime()-lastVisit.getTime();
int diffInDays=(int)(diff/(1000*60*60*24));
字符串lastVisited=Float.toString(diffInDays);
profilelastVisiteTextView.setText(lastVisited);
如果(diffInDays==0){
profilelastVisiteTextView.setText(“今天”);
}否则{
profilelastVisiteTextView.setText(lastVisited+“几天前”);
}
//轮廓图像
ParseFile imageFile=seller.getParseFile(“profileImage”);
getDataInBackground(新的GetDataCallback(){
公共无效完成(字节[]数据,解析异常e){
如果(e==null){
//数据包含用于恢复的字节数
位图图像=位图工厂.decodeByteArray(数据,0,数据.length);
profileImageView.setImageBitmap(图像);
}否则{
//出了点问题
显示错误信息(e);
}
}
});
}否则{
显示错误信息(e);
}
}
});
返回单元;
}
而且情况变得更糟,因为Android倾向于为一个手机多次调用getView。在我滚动一段时间后,由于太多的后台工作,应用程序崩溃了
我的问题是,,
首先,这种差异是由Android real设备和iOS real设备的性能差异造成的吗?(这是一款全新的安卓系统,2g内存,4核,是为未来而购买的,而不是2年前的iPhone4S)
第二,如果上面所说的是正确的,我有没有办法提高性能?我的编码正确吗?
非常感谢您抽出时间 我找到了答案。由于内存问题,应用程序崩溃。我正在将许多图像加载到gridView中。 我找到了一些方法来克服这个问题。基本上需要两个步骤。 首先,启动一个进程对话框,下载数据