2016-11-20 52 views
0

在我的應用程序中,我嘗試使書籍與MBaaS Backendless同步。因此,我從Backendless中獲取它們後,生成一個List來保存所有書名。我從服務器獲得正確的數據(沒有重複),但我的for循環啓動得太早,所以沒有數據可以迭代。 在啓動我的for-loop之前,我怎樣才能輕鬆完成填充列表? 這是我的代碼:錯誤的同步任務順序

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

正在發生的事情是,你的執行代碼的find方法,其中異步確實後端調用(在不同的線程),那麼它會直接進入Log.dfor循環指令,並且只有當後端響應準備就緒時,它纔會調用handleResponse方法。

解決它的最簡單方法是將for循環移到handleResponse之內,在while循環之後;取決於你想如何構建你的代碼,還有其他的方法可以通過在一個方法中寫入for循環並從handleResponse調用這個方法來實現,還有選擇哪個線程應該執行這個代碼的方法。但是問題中沒有足夠的信息來給你一個適當的建議。

+0

我已經試圖移動handleResponse裏面的for循環,但它沒有工作,因爲我在for循環(在代碼中不可見)與Backendless進行第二次同步,並且這兩者的組合是有問題的。 。 – Timitrov

+0

發佈完整的代碼,也許我們可以幫助。 – palako

+0

我添加了其餘的代碼。我希望你現在可以更好地理解我的問題在哪裏...... – Timitrov