2016-11-20 20 views
0

私のアプリケーションでは、MBaaS Backendlessと書籍を同期させようとしています。そのため、私はリストを生成して、Backendlessからそれらを取得した後で、すべての本のタイトルを内部に保存します。私はサーバーから(重複なしで)正しいデータを取得しますが、私のforループはあまりに早く開始しているので、反復するデータはありません。 forループを開始する前にListの塗りつぶしを簡単に完了するにはどうしたらいいですか? これは私のコードです:何が起こっている同期中のタスクの順序が正しくない

final List<String> all_books_without_duplicates = new ArrayList<String>(); 
// queryId = Id of the user 
Backendless.Data.of(Books.class).find(queryId, newLoadingCallback<BackendlessCollection<Books>>(this, getString(R.string.loading_books), true) { 
@Override 
public void handleResponse(BackendlessCollection<Books> booksBackendlessCollection) { 
    Iterator<Books> booksIterator = booksBackendlessCollection.getCurrentPage().iterator(); 
    while (booksIterator.hasNext()) { 
    Books booksonline = booksIterator.next(); 
    final String book_title = booksonline.getBookTitle(); 
    // avoid duplictes 
    if (!all_books_without_duplicates.contains(book_title)) { 
    all_books_without_duplicates.add(book_title); 
    Log.d("added book title:", book_title); 
    }}}}); 
    Log.d("for-loop elements: ", String.valueOf(all_books_without_duplicates)); 
    for (int x=0; x<all_books_without_duplicates.size(); x++){ 
    final String book_title_value = all_books_without_duplicates.get(x); 
    String whereClause = "booktitle LIKE '%" + book_title_value + "%'"; 
    QueryOptions queryOptions = new QueryOptions(); 
    queryOptions.setRelated(Arrays.asList("book")); 
    BackendlessDataQuery query = new BackendlessDataQuery(queryOptions); 
    query.setWhereClause(whereClause); 
    // get all book-ids from Backendless where title is x 
    Backendless.Data.of(BookIds.class).find(query, new LoadingCallback<BackendlessCollection<BookIds>>(MainActivity.this, getString(R.string.loading_books), true) { 
    @Override 
    public void handleResponse(BackendlessCollection<BookIds> bookIDsBackendlessCollection) { 
    super.handleResponse(bookIDsBackendlessCollection); 
    Iterator<BookIds> bookIDsSyncIterator = bookIDsBackendlessCollection.getCurrentPage().iterator(); 
    while (bookIDsSyncIterator.hasNext()){ 
    BookIds book_ids = bookIDsSyncIterator.next(); 
    String book_id_be = book_ids.getObjectId(); 
    // get all book-ids from SQLite-DB 
    DatabaseHelper db=new DatabaseHelper(getApplicationContext()); 
    final List<String>bookIds_sql = db.getAllBookIds(); 
    // save new book in SQLite if it lacked so far 
    if(bookIds_sql.contains(book_id_be)){ 
    // book already exists 
    } 
    else{ 
    saveNewBookFromBackendless(book_id_be); 
    } 
    }}});} 

答えて

0

は、あなたのコードは、それがまっすぐLog.dforループ命令に起こって、非同期に(異なるスレッドで)バックエンドの呼び出しを行うfind方法を実行していることですバックエンドの応答が準備されている場合にのみ、handleResponseメソッドが呼び出されます。

これを修正する最も簡単な方法は、ループのループの後にhandleResponseの内部にforループを移動することです。どのようにコードを構造化したいかによって、メソッドにforループを記述し、このメソッドをhandleResponseから呼び出すことによって他の方法があります。また、このコードを実行するスレッドを選択する方法もあります。しかし、あなたに適切な勧告を与えるのに十分な情報はありません。

+0

私はhandleResponse内でforループを移動しようとしましたが、私のforループ内で(コードには表示されません)Backendlessと2回目の同期をとるため動作しませんでした。 – Timitrov

+0

完全なコードを投稿してください – palako

+0

残りのコードを追加しました。私はあなたが今私の問題がどこにあるのかをよりよく理解できることを願っています... – Timitrov

関連する問題