How to wait for RxJava asynchronous call to complete before continuing to the rest of the code?
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
add a comment |
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
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
add a comment |
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
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
android multithreading rx-java2 android-architecture-components ui-thread
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
add a comment |
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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