2016-11-20 5 views
0

내 응용 프로그램에서 MBaaS Backendless와 서적을 동기화하려고합니다. 그러므로 나는 Backendless에서 가져온 후에 모든 책 제목을 저장하기 위해 목록을 생성합니다. 서버 (중복없이)에서 올바른 데이터를 얻지 만 for 루프가 너무 일찍 시작하므로 반복 할 데이터가 없습니다. for-loop를 시작하기 전에 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

어떤 일이 일어나고하는 코드를 비동기 적으로 (다른 스레드에서) 백엔드 호출을 수행하는 find 방법을 실행하는 것입니다, 다음은 Log.dfor 루프 명령으로 직선거야 백엔드 응답이 준비된 경우에만 handleResponse 메서드를 호출합니다.

가장 쉬운 방법은 루프 이후에 handleResponse 안에 for 루프를 이동하는 것입니다. 어떻게 코드를 구조화 할 것인가에 따라 메소드에 for 루프를 작성하고 handleResponse에서이 메소드를 호출하는 다른 방법이 있습니다. 또한이 코드를 실행할 스레드를 선택하는 방법도 있습니다. 그러나 당신에게 적절한 권고를주기에 충분한 정보가 없습니다.

+0

handleResponse 내부에서 for 루프를 이미 이동하려고 시도했지만, for 루프 내에서 (코드에 표시되지 않음) Backendless와 두 번째 동기화를 수행 했으므로 작동하지 않았습니다.이 두 가지 조합이 문제가됩니다. . – Timitrov

+0

전체 코드를 게시하십시오. 아마도 도움이 될 것입니다. – palako

+0

나머지 코드를 추가했습니다. 내 문제가 어디에 있는지 더 잘 이해할 수 있기를 바랍니다. – Timitrov

관련 문제