2016-11-20 1 views
0

In meiner Anwendung versuche ich Bücher mit dem MBaaS Backendless zu synchronisieren. Dazu erstelle ich eine Liste, in der alle Buchtitel gespeichert werden, nachdem sie von Backendless abgerufen wurden. Ich bekomme die richtigen Daten vom Server (ohne Duplikate), aber meine For-Schleife startet zu früh, so dass keine Daten durchlaufen werden müssen. Wie kann ich einfach das Füllen der Liste beenden, bevor ich meine For-Schleife starte? Dies ist mein Code:Falsche Reihenfolge der Aufgaben während der Synchronisation

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); 
    } 
    }}});} 

Antwort

0

Was passiert ist, dass Ihr Code die find Methode ausgeführt wird, die den Back-End-Aufruf asynchron tut (in einem anderen Thread), dann es geht um direkt in die Log.d und for Schleifenanweisungen und nur wenn die Backend-Antwort bereit ist, ruft sie die Methode handleResponse auf.

Der einfachste Weg, es zu beheben, ist die for Schleife innerhalb der handleResponse, nach Ihrer while Schleife zu verschieben; Abhängig davon, wie Sie Ihren Code strukturieren möchten, gibt es andere Möglichkeiten, dies zu tun, indem Sie Ihre for-Schleife in eine Methode schreiben und diese Methode von handleResponse aufrufen, und es gibt auch Möglichkeiten zu wählen, welcher Thread diesen Code ausführen soll. Aber es gibt keine ausreichenden Informationen in der Frage, um Ihnen eine angemessene Empfehlung dafür zu geben.

+0

Ich habe bereits versucht, die for-Schleife in der HandleResponse zu verschieben, aber es hat nicht funktioniert, weil ich eine zweite Synchronisation mit Backendless in meiner for-Schleife (nicht im Code sichtbar) und die Kombination dieser beiden ist problematisch. – Timitrov

+0

poste den vollen Code, vielleicht können wir dann helfen. – palako

+0

Ich habe den Rest des Codes hinzugefügt. Ich hoffe, Sie können jetzt besser verstehen, wo mein Problem ist ... – Timitrov

Verwandte Themen