How to wait for RxJava asynchronous call to complete before continuing to the rest of the code?












0















I'm using Architecture Components. This app shows a bunch of products to users. In the repository I have a function fetchProducts() that should fetch products that are not yet in the database. To do this I first need to query the database to find the most recent product(they have a date) there so that I don't fetch products that already in the database. Now this is obviously very important as I don't want to do more work than needed. How do I wait for the asynchronous call to finish? This is what I tried:



LiveData<Boolean> fetchProducts() {
MutableLiveData<Boolean> booleanLoadingComplete = new MutableLiveData<>();
final CountDownLatch countDownLatch = new CountDownLatch(1);
final ProductWrapper productWrapper = new ProductWrapper();
productDao.getMostRecentProduct()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ProductEntity>() {
@Override
public void accept(ProductEntity productEntity) throws Exception {
productWrapper.product = productEntity;
countDownLatch.countDown();
}
});
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}

// now we should be able to safely proceed with the rest of the code
// more code goes here...

return booleanLoadingComplete;
}


Using CountDownLatch seemed like a good idea but when I tried this the app simply froze showing a blank screen.



This is the Dao. I'm beginner with RxJava and I don't know if Flowable is appropriate for this case.



@Dao
public interface ProductDao {

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(ProductEntity product);

@Query("SELECT * FROM product ORDER BY published_at DESC")
LiveData<List<ProductEntity>> getProducts();

@Query("SELECT * FROM product ORDER BY published_at DESC LIMIT 1")
Flowable<ProductEntity> getMostRecentProduct();
}









share|improve this question


















  • 2





    you combine the logic into a single rx chain. At glance, I would suggest you to look into the flatMap operator. E.g. productDao.getMostRecentProduct().flatmap(product -> {someClass.fetchProducts(product.date)}).blabla.subscribe()

    – Tim Castelijns
    Nov 22 '18 at 15:08


















0















I'm using Architecture Components. This app shows a bunch of products to users. In the repository I have a function fetchProducts() that should fetch products that are not yet in the database. To do this I first need to query the database to find the most recent product(they have a date) there so that I don't fetch products that already in the database. Now this is obviously very important as I don't want to do more work than needed. How do I wait for the asynchronous call to finish? This is what I tried:



LiveData<Boolean> fetchProducts() {
MutableLiveData<Boolean> booleanLoadingComplete = new MutableLiveData<>();
final CountDownLatch countDownLatch = new CountDownLatch(1);
final ProductWrapper productWrapper = new ProductWrapper();
productDao.getMostRecentProduct()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ProductEntity>() {
@Override
public void accept(ProductEntity productEntity) throws Exception {
productWrapper.product = productEntity;
countDownLatch.countDown();
}
});
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}

// now we should be able to safely proceed with the rest of the code
// more code goes here...

return booleanLoadingComplete;
}


Using CountDownLatch seemed like a good idea but when I tried this the app simply froze showing a blank screen.



This is the Dao. I'm beginner with RxJava and I don't know if Flowable is appropriate for this case.



@Dao
public interface ProductDao {

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(ProductEntity product);

@Query("SELECT * FROM product ORDER BY published_at DESC")
LiveData<List<ProductEntity>> getProducts();

@Query("SELECT * FROM product ORDER BY published_at DESC LIMIT 1")
Flowable<ProductEntity> getMostRecentProduct();
}









share|improve this question


















  • 2





    you combine the logic into a single rx chain. At glance, I would suggest you to look into the flatMap operator. E.g. productDao.getMostRecentProduct().flatmap(product -> {someClass.fetchProducts(product.date)}).blabla.subscribe()

    – Tim Castelijns
    Nov 22 '18 at 15:08
















0












0








0








I'm using Architecture Components. This app shows a bunch of products to users. In the repository I have a function fetchProducts() that should fetch products that are not yet in the database. To do this I first need to query the database to find the most recent product(they have a date) there so that I don't fetch products that already in the database. Now this is obviously very important as I don't want to do more work than needed. How do I wait for the asynchronous call to finish? This is what I tried:



LiveData<Boolean> fetchProducts() {
MutableLiveData<Boolean> booleanLoadingComplete = new MutableLiveData<>();
final CountDownLatch countDownLatch = new CountDownLatch(1);
final ProductWrapper productWrapper = new ProductWrapper();
productDao.getMostRecentProduct()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ProductEntity>() {
@Override
public void accept(ProductEntity productEntity) throws Exception {
productWrapper.product = productEntity;
countDownLatch.countDown();
}
});
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}

// now we should be able to safely proceed with the rest of the code
// more code goes here...

return booleanLoadingComplete;
}


Using CountDownLatch seemed like a good idea but when I tried this the app simply froze showing a blank screen.



This is the Dao. I'm beginner with RxJava and I don't know if Flowable is appropriate for this case.



@Dao
public interface ProductDao {

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(ProductEntity product);

@Query("SELECT * FROM product ORDER BY published_at DESC")
LiveData<List<ProductEntity>> getProducts();

@Query("SELECT * FROM product ORDER BY published_at DESC LIMIT 1")
Flowable<ProductEntity> getMostRecentProduct();
}









share|improve this question














I'm using Architecture Components. This app shows a bunch of products to users. In the repository I have a function fetchProducts() that should fetch products that are not yet in the database. To do this I first need to query the database to find the most recent product(they have a date) there so that I don't fetch products that already in the database. Now this is obviously very important as I don't want to do more work than needed. How do I wait for the asynchronous call to finish? This is what I tried:



LiveData<Boolean> fetchProducts() {
MutableLiveData<Boolean> booleanLoadingComplete = new MutableLiveData<>();
final CountDownLatch countDownLatch = new CountDownLatch(1);
final ProductWrapper productWrapper = new ProductWrapper();
productDao.getMostRecentProduct()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ProductEntity>() {
@Override
public void accept(ProductEntity productEntity) throws Exception {
productWrapper.product = productEntity;
countDownLatch.countDown();
}
});
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}

// now we should be able to safely proceed with the rest of the code
// more code goes here...

return booleanLoadingComplete;
}


Using CountDownLatch seemed like a good idea but when I tried this the app simply froze showing a blank screen.



This is the Dao. I'm beginner with RxJava and I don't know if Flowable is appropriate for this case.



@Dao
public interface ProductDao {

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(ProductEntity product);

@Query("SELECT * FROM product ORDER BY published_at DESC")
LiveData<List<ProductEntity>> getProducts();

@Query("SELECT * FROM product ORDER BY published_at DESC LIMIT 1")
Flowable<ProductEntity> getMostRecentProduct();
}






android multithreading rx-java2 android-architecture-components ui-thread






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 22 '18 at 14:59









xplandxpland

32




32








  • 2





    you combine the logic into a single rx chain. At glance, I would suggest you to look into the flatMap operator. E.g. productDao.getMostRecentProduct().flatmap(product -> {someClass.fetchProducts(product.date)}).blabla.subscribe()

    – Tim Castelijns
    Nov 22 '18 at 15:08
















  • 2





    you combine the logic into a single rx chain. At glance, I would suggest you to look into the flatMap operator. E.g. productDao.getMostRecentProduct().flatmap(product -> {someClass.fetchProducts(product.date)}).blabla.subscribe()

    – Tim Castelijns
    Nov 22 '18 at 15:08










2




2





you combine the logic into a single rx chain. At glance, I would suggest you to look into the flatMap operator. E.g. productDao.getMostRecentProduct().flatmap(product -> {someClass.fetchProducts(product.date)}).blabla.subscribe()

– Tim Castelijns
Nov 22 '18 at 15:08







you combine the logic into a single rx chain. At glance, I would suggest you to look into the flatMap operator. E.g. productDao.getMostRecentProduct().flatmap(product -> {someClass.fetchProducts(product.date)}).blabla.subscribe()

– Tim Castelijns
Nov 22 '18 at 15:08














0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53433632%2fhow-to-wait-for-rxjava-asynchronous-call-to-complete-before-continuing-to-the-re%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53433632%2fhow-to-wait-for-rxjava-asynchronous-call-to-complete-before-continuing-to-the-re%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

404 Error Contact Form 7 ajax form submitting

How to know if a Active Directory user can login interactively

TypeError: fit_transform() missing 1 required positional argument: 'X'