2017-05-01 5 views
0

私にはわかりにくい複雑な問題があります。このクラスでは、
の1つのarraylistリストから21のランダムなオブジェクトをarraylist finalChallengesに追加したいと思います。しかし、それは動作しません、時にはfinalChallangesは21個のオブジェクトを含んでいますが、ほとんどの場合オブジェクトの数は少なくなりますが、どこに問題があるのか​​分かりません。実際には、私はすべてのステップをコメントしようとしたが、何か間違っていたら、教えてください。それは非常に可能性の高い問題である: はfinalChallengesが初期化されている場所が表示されませんし、我々はそれが応答ハンドラで非同期に上書きされて見ることができますユーザプロパティ、コンコードのないランダムオブジェクト..なぜ機能しないのですか?なぜ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) { 

     } 
    }); 

答えて

0

..私は私が何をすべきかshoud見当がつかない、私を助けてくださいの同時アクセス。

finalChallengesのインスタンスが、そのハンドラの異なる/同時実行で「共有」されていない場合、別のリストのランダムな要素からリストを埋めるロジック自体は正しいでしょう。また

、小さなヒント:あなたがこれを行うことができますループせずに一度にあなたの一時リストを作成するを:List<Challenge> temp = new ArrayList<>(listChallenges);

編集:2つの提案。

  1. あなたはそれを埋めるときをコピーbackendlessUser.setProperty("userChallenges", new ArrayList<>(finalChallenges));)を渡し、ユーザーのプロパティにリストを渡すと、その後アトミック(listChallenges = tempNewList
  2. リストを交換し、あなたのループ内の一時的なリストを使用し
+0

答えをありがとう。私は編集しました。実際にそれは非常にうまく動作します、私はあなたの答えを受け入れるつもりですが、あなたはなぜユーザープロパティのオブジェクトを設定するのを助けることができますか?例えば、finalCHALLENESはconatins 21を、プロパティはちょうど12を加えます。あなたが私がgreatfullになるのを助けることができる場合 – Storg

+0

申し訳ありませんあなたの質問を理解していない。ここでは非常に遅いですが、今は出発しなければなりませんが、明日は必要に応じて詳細を説明することができます。 –

+0

ありがとう、私は今のようにどのように見えるのかという質問のコードを編集しました。 – Storg

関連する問題