用户属性,没有 concord 的随机对象 .. 为什么不起作用?为什么没有得到 21 个对象?
User properties, random object without concord .. Why doesn't works? Why doesn't get 21 objects?
我有一个复杂的问题,我不明白。在这class我想
将来自一个数组列表 listChallenges 的 21 个随机对象添加到数组列表 finalChallenges。然而它不起作用,有时 finalChallanges 包含 21 个对象,但大多数时候它包含的对象较少,但我不知道问题出在哪里。实际上,我尝试对每一步进行评论,如果做错了什么,请告诉我。
请帮帮我,我不知道该怎么办..
ArrayList<Challenges> listChallenges = new ArrayList<Challenges>();
ArrayList<Challenges> finalChallenges = new ArrayList<Challenges>(20);
//Check where the same userId and subscribers.objectId,
//Request these categories object and save to the ArrayList<Category> totalCategories
//Save these categories objectId to the selectedCategoriesId List<String>
BackendlessDataQuery query = new BackendlessDataQuery();
query.setWhereClause( "subscribers.objectId = '"+backendlessUser.getObjectId()+"'");
Backendless.Data.of(Category.class).find(query, new AsyncCallback<BackendlessCollection<Category>>() {
@Override
public void handleResponse(BackendlessCollection<Category> categoriesBackendlessCollection) {
//add selected categories to totalActivities Category ArrayList
for( Category categories : categoriesBackendlessCollection.getData()) {
totalCategories.add(categories);
selectedCategoriesId.add(categories.getObjectId());
//
}
System.out.println(selectedCategoriesId);
//For cycle is going to selectedCategoriesId.size
//Check where the same category-objectId and actual selectedCategoriesId
//Request these challenges object, which are in the actual category and save to the ArrayList<Challenges> listChallenges
//Save these categories objectId to the selectedCategoriesId List<String>
for(int k=0;k<selectedCategoriesId.size();k++) {
BackendlessDataQuery query = new BackendlessDataQuery();
query.setPageSize(pageSize);
query.setWhereClause("category.objectId = '" + selectedCategoriesId.get(k) + "'");
Backendless.Data.of(Challenges.class).find(query, new AsyncCallback<BackendlessCollection<Challenges>>() {
@Override
public void handleResponse(BackendlessCollection<Challenges> cha) {
for (Challenges challenges : cha.getData()) {
listChallenges.add(challenges);
challengeTitle.add(challenges.getChallengeTitle());
challengeContent.add(challenges.getChallengeContent());
challangeId.add(challenges.getObjectId());
}
System.out.println("osszes elem:"+listChallenges);
//ArrayList<Challenges> finalChallenges size is 21 with 0
// get from listChallenges random 21 object without concord and add to the finalChallenges
Random random = new Random();
List<Challenges> temp = new ArrayList<>(listChallenges);
ArrayList<Challenges> tempNewList = new ArrayList<Challenges>();
//ArrayList<Challenges> temp = new ArrayList<Challenges>(listChallenges.size());
for (Challenges item : listChallenges) temp.add(item);
while (finalChallenges.size()<21 && temp.size()>0) {
int index = random.nextInt(temp.size());
tempNewList.add(temp.get(index));
temp.remove(index);
finalChallenges= tempNewList;
}
// System.out.println("kihívások");
System.out.println(finalChallenges);
System.out.println(finalChallenges.size());
// title.setText(challengeTitle.get(0));
// content.setText(challengeContent.get(0));
// objectId = challangeId.get(0);
}
@Override
public void handleFault(BackendlessFault fault) {
}
});
//save finalChallenges array objects to the current user "userChallenges" relationship
Backendless.UserService.login( email, password, new AsyncCallback<BackendlessUser>() {
@Override
public void handleResponse(BackendlessUser backendlessUser) {
backendlessUser.setProperty("userChallenges",new ArrayList<>(finalChallenges));
}
});
Backendless.UserService.update(backendlessUser, new BackendlessCallback<BackendlessUser>() {
@Override
public void handleResponse(BackendlessUser response) {
System.out.println( "User has been updated" );
}
@Override
public void handleFault(BackendlessFault fault) {
System.out.println( "User has not been updated");
}
});
}
@Override
public void handleFault(BackendlessFault backendlessFault) {
System.out.println( "Server reported an error - " + backendlessFault.getMessage() );
}
},true);
}
}
@Override
public void handleFault(BackendlessFault fault) {
}
});
您没有显示 finalChallenges
的初始化位置,我们可以看到它在响应处理程序中被异步覆盖:这很可能是并发访问的问题。
如果 finalChallenges
的实例不是 "shared" 在该处理程序的 different/concurrent 执行中,您从另一个列表的随机元素填充列表的逻辑本身是正确的。
此外,一个小提示:要在没有循环的情况下一次性创建临时列表,您可以这样做:List<Challenge> temp = new ArrayList<>(listChallenges);
编辑:2 条建议。
- 填充时在循环中使用临时列表,然后自动交换列表(
listChallenges = tempNewList
)
- 当您将列表传递给用户属性时,传递一个副本 (
backendlessUser.setProperty("userChallenges", new ArrayList<>(finalChallenges));
)
我有一个复杂的问题,我不明白。在这class我想
将来自一个数组列表 listChallenges 的 21 个随机对象添加到数组列表 finalChallenges。然而它不起作用,有时 finalChallanges 包含 21 个对象,但大多数时候它包含的对象较少,但我不知道问题出在哪里。实际上,我尝试对每一步进行评论,如果做错了什么,请告诉我。
请帮帮我,我不知道该怎么办..
ArrayList<Challenges> listChallenges = new ArrayList<Challenges>();
ArrayList<Challenges> finalChallenges = new ArrayList<Challenges>(20);
//Check where the same userId and subscribers.objectId,
//Request these categories object and save to the ArrayList<Category> totalCategories
//Save these categories objectId to the selectedCategoriesId List<String>
BackendlessDataQuery query = new BackendlessDataQuery();
query.setWhereClause( "subscribers.objectId = '"+backendlessUser.getObjectId()+"'");
Backendless.Data.of(Category.class).find(query, new AsyncCallback<BackendlessCollection<Category>>() {
@Override
public void handleResponse(BackendlessCollection<Category> categoriesBackendlessCollection) {
//add selected categories to totalActivities Category ArrayList
for( Category categories : categoriesBackendlessCollection.getData()) {
totalCategories.add(categories);
selectedCategoriesId.add(categories.getObjectId());
//
}
System.out.println(selectedCategoriesId);
//For cycle is going to selectedCategoriesId.size
//Check where the same category-objectId and actual selectedCategoriesId
//Request these challenges object, which are in the actual category and save to the ArrayList<Challenges> listChallenges
//Save these categories objectId to the selectedCategoriesId List<String>
for(int k=0;k<selectedCategoriesId.size();k++) {
BackendlessDataQuery query = new BackendlessDataQuery();
query.setPageSize(pageSize);
query.setWhereClause("category.objectId = '" + selectedCategoriesId.get(k) + "'");
Backendless.Data.of(Challenges.class).find(query, new AsyncCallback<BackendlessCollection<Challenges>>() {
@Override
public void handleResponse(BackendlessCollection<Challenges> cha) {
for (Challenges challenges : cha.getData()) {
listChallenges.add(challenges);
challengeTitle.add(challenges.getChallengeTitle());
challengeContent.add(challenges.getChallengeContent());
challangeId.add(challenges.getObjectId());
}
System.out.println("osszes elem:"+listChallenges);
//ArrayList<Challenges> finalChallenges size is 21 with 0
// get from listChallenges random 21 object without concord and add to the finalChallenges
Random random = new Random();
List<Challenges> temp = new ArrayList<>(listChallenges);
ArrayList<Challenges> tempNewList = new ArrayList<Challenges>();
//ArrayList<Challenges> temp = new ArrayList<Challenges>(listChallenges.size());
for (Challenges item : listChallenges) temp.add(item);
while (finalChallenges.size()<21 && temp.size()>0) {
int index = random.nextInt(temp.size());
tempNewList.add(temp.get(index));
temp.remove(index);
finalChallenges= tempNewList;
}
// System.out.println("kihívások");
System.out.println(finalChallenges);
System.out.println(finalChallenges.size());
// title.setText(challengeTitle.get(0));
// content.setText(challengeContent.get(0));
// objectId = challangeId.get(0);
}
@Override
public void handleFault(BackendlessFault fault) {
}
});
//save finalChallenges array objects to the current user "userChallenges" relationship
Backendless.UserService.login( email, password, new AsyncCallback<BackendlessUser>() {
@Override
public void handleResponse(BackendlessUser backendlessUser) {
backendlessUser.setProperty("userChallenges",new ArrayList<>(finalChallenges));
}
});
Backendless.UserService.update(backendlessUser, new BackendlessCallback<BackendlessUser>() {
@Override
public void handleResponse(BackendlessUser response) {
System.out.println( "User has been updated" );
}
@Override
public void handleFault(BackendlessFault fault) {
System.out.println( "User has not been updated");
}
});
}
@Override
public void handleFault(BackendlessFault backendlessFault) {
System.out.println( "Server reported an error - " + backendlessFault.getMessage() );
}
},true);
}
}
@Override
public void handleFault(BackendlessFault fault) {
}
});
您没有显示 finalChallenges
的初始化位置,我们可以看到它在响应处理程序中被异步覆盖:这很可能是并发访问的问题。
如果 finalChallenges
的实例不是 "shared" 在该处理程序的 different/concurrent 执行中,您从另一个列表的随机元素填充列表的逻辑本身是正确的。
此外,一个小提示:要在没有循环的情况下一次性创建临时列表,您可以这样做:List<Challenge> temp = new ArrayList<>(listChallenges);
编辑:2 条建议。
- 填充时在循环中使用临时列表,然后自动交换列表(
listChallenges = tempNewList
) - 当您将列表传递给用户属性时,传递一个副本 (
backendlessUser.setProperty("userChallenges", new ArrayList<>(finalChallenges));
)