未进行 RxJava 2 / Retrofit 2 调用
RxJava 2 / Retrofit 2 call not being made
我正在尝试将所有本地数据与服务器上的数据同步,因此我正在获取所有本地数据,对于本地数据以外的任何数据,我正在调用服务器以获取其余数据。
public Observable<List<Chat>> getChats(int userId) {
Log.i("chatRequest", TAG);
return Observable.merge(chatDiskData.getChats(), chatDiskData.getChats().flatMap(new Function<RealmResults<Chat>, ObservableSource<List<Chat>>>() {
@Override
public ObservableSource<List<Chat>> apply(@NonNull RealmResults<Chat> chats) throws Exception {
Log.i("chatRequest", TAG + " inside");
ArrayList<String> chatIds = new ArrayList<>();
HashMap<String, Long> chatsTimeStamp = new HashMap<>();
for (int i = 0; i < chats.size(); i++) {
String chatId = chats.get(i).getChat_id();
chatIds.add(chatId);
long timestamp = chatDiskData.lastMessage(chatId);
chatsTimeStamp.put(chatId, timestamp);
}
return chatCloudData.getChats(userId, chatIds, chatsTimeStamp).subscribeOn(Schedulers.io())
.doOnNext(chats1 -> Log.i("chatRequest", TAG + " inside inside"));
}
}));
}
ChatCloudData
public Observable<List<Chat>> getChats(int userId, ArrayList<String>
chatIds, HashMap<String, Long> chats) {
Log.i("chatRequest", TAG);
ChatsRequest chatsRequest = new ChatsRequest.Builder(userId)
.chatIDs(chatIds)
.chats(chats)
.build();
return apiService.getChats(chatsRequest);
}
端点
@POST("Chat/sync")
Observable<List<Chat>> getChats(@Body ChatsRequest chatsRequest);
输出结果如下
03-11 22:44:45.430 31540-31540/com.project I/chatRequest: com.project.ChatFragment
03-11 22:44:45.430 31540-31540/com.project I/chatRequest: com.project.Repository.ChatRepository
03-11 22:44:45.430 31540-31540/com.project I/chatRequest: com.project.Repository.ChatDiskData getChats
03-11 22:44:45.436 31540-31540/com.project I/chatRequest: com.project.Repository.ChatDiskData getChats
03-11 22:44:45.442 31540-31815/com.project I/chatRequest: com.project.Repository.ChatRepository inside
为什么不调用cloudData的getChats方法?
我认为您应该精确确定要发出值的调度程序:
return chatCloudData.getChats(userId, chatIds, chatsTimeStamp).subscribeOn(Schedulers.io()).observeOn(relevantScheduler)
.doOnNext(chats1 -> Log.i("chatRequest", TAG + " inside inside"));
编辑:
public Observable<List<Chat>> getChats(int userId) {
Log.i("chatRequest", TAG);
return Observable.merge(chatDiskData.getChats(), chatDiskData.getChats().flatMap(new Function<RealmResults<Chat>, ObservableSource<List<Chat>>>() {
@Override
public ObservableSource<List<Chat>> apply(@NonNull RealmResults<Chat> chats) throws Exception {
Log.i("chatRequest", TAG + " inside");
ArrayList<String> chatIds = new ArrayList<>();
HashMap<String, Long> chatsTimeStamp = new HashMap<>();
for (int i = 0; i < chats.size(); i++) {
String chatId = chats.get(i).getChat_id();
chatIds.add(chatId);
long timestamp = chatDiskData.lastMessage(chatId);
chatsTimeStamp.put(chatId, timestamp);
}
return Observable.fromCallable(new Callable<List<Chat>>() {
@Override
public List<Chat> call() throws Exception {
return chatCloudData.getChats(userId, chatIds, chatsTimeStamp).subscribeOn(Schedulers.io())
.doOnNext(chats1 -> Log.i("chatRequest", TAG + " inside inside"));
}
});
}
}));
}
ChatCloudData
public List<Chat> getChats(int userId, ArrayList<String>
chatIds, HashMap<String, Long> chats) {
Log.i("chatRequest", TAG);
ChatsRequest chatsRequest = new ChatsRequest.Builder(userId)
.chatIDs(chatIds)
.chats(chats)
.build();
return apiService.getChats(chatsRequest);
}
端点
@POST("Chat/sync")
List<Chat> getChats(@Body ChatsRequest chatsRequest);
希望这对您有所帮助。
对不起我的英语。
return Observable.merge(chatDiskData.getChats().observeOn(AndroidSchedulers.mainThread()),
chatDiskData.getChats().observeOn(AndroidSchedulers.mainThread())
.flatMap(new Function<RealmResults<Chat>, ObservableSource<List<Chat>>>() {
@Override
public ObservableSource<List<Chat>> apply(@NonNull RealmResults<Chat> chats) throws Exception {
Log.i("chatRequest", TAG + " inside");
ArrayList<String> chatIds = new ArrayList<>();
HashMap<String, Long> chatsTimeStamp = new HashMap<>();
for (int i = 0; i < chats.size(); i++) {
String chatId = chats.get(i).getChat_id();
chatIds.add(chatId);
long timestamp = chatDiskData.lastMessage(chatId);
chatsTimeStamp.put(chatId, timestamp);
}
return chatCloudData.getChats(userId, chatIds, chatsTimeStamp).subscribeOn(Schedulers.io())
.doOnNext(chats1 -> Log.i("chatRequest", TAG + " inside inside"));
}
}));
.observeOn(AndroidSchedulers.mainThread() 是我使用领域的重要部分,它在不同的线程上获取数据。
我正在尝试将所有本地数据与服务器上的数据同步,因此我正在获取所有本地数据,对于本地数据以外的任何数据,我正在调用服务器以获取其余数据。
public Observable<List<Chat>> getChats(int userId) {
Log.i("chatRequest", TAG);
return Observable.merge(chatDiskData.getChats(), chatDiskData.getChats().flatMap(new Function<RealmResults<Chat>, ObservableSource<List<Chat>>>() {
@Override
public ObservableSource<List<Chat>> apply(@NonNull RealmResults<Chat> chats) throws Exception {
Log.i("chatRequest", TAG + " inside");
ArrayList<String> chatIds = new ArrayList<>();
HashMap<String, Long> chatsTimeStamp = new HashMap<>();
for (int i = 0; i < chats.size(); i++) {
String chatId = chats.get(i).getChat_id();
chatIds.add(chatId);
long timestamp = chatDiskData.lastMessage(chatId);
chatsTimeStamp.put(chatId, timestamp);
}
return chatCloudData.getChats(userId, chatIds, chatsTimeStamp).subscribeOn(Schedulers.io())
.doOnNext(chats1 -> Log.i("chatRequest", TAG + " inside inside"));
}
}));
}
ChatCloudData
public Observable<List<Chat>> getChats(int userId, ArrayList<String>
chatIds, HashMap<String, Long> chats) {
Log.i("chatRequest", TAG);
ChatsRequest chatsRequest = new ChatsRequest.Builder(userId)
.chatIDs(chatIds)
.chats(chats)
.build();
return apiService.getChats(chatsRequest);
}
端点
@POST("Chat/sync")
Observable<List<Chat>> getChats(@Body ChatsRequest chatsRequest);
输出结果如下
03-11 22:44:45.430 31540-31540/com.project I/chatRequest: com.project.ChatFragment
03-11 22:44:45.430 31540-31540/com.project I/chatRequest: com.project.Repository.ChatRepository
03-11 22:44:45.430 31540-31540/com.project I/chatRequest: com.project.Repository.ChatDiskData getChats
03-11 22:44:45.436 31540-31540/com.project I/chatRequest: com.project.Repository.ChatDiskData getChats
03-11 22:44:45.442 31540-31815/com.project I/chatRequest: com.project.Repository.ChatRepository inside
为什么不调用cloudData的getChats方法?
我认为您应该精确确定要发出值的调度程序:
return chatCloudData.getChats(userId, chatIds, chatsTimeStamp).subscribeOn(Schedulers.io()).observeOn(relevantScheduler)
.doOnNext(chats1 -> Log.i("chatRequest", TAG + " inside inside"));
编辑:
public Observable<List<Chat>> getChats(int userId) {
Log.i("chatRequest", TAG);
return Observable.merge(chatDiskData.getChats(), chatDiskData.getChats().flatMap(new Function<RealmResults<Chat>, ObservableSource<List<Chat>>>() {
@Override
public ObservableSource<List<Chat>> apply(@NonNull RealmResults<Chat> chats) throws Exception {
Log.i("chatRequest", TAG + " inside");
ArrayList<String> chatIds = new ArrayList<>();
HashMap<String, Long> chatsTimeStamp = new HashMap<>();
for (int i = 0; i < chats.size(); i++) {
String chatId = chats.get(i).getChat_id();
chatIds.add(chatId);
long timestamp = chatDiskData.lastMessage(chatId);
chatsTimeStamp.put(chatId, timestamp);
}
return Observable.fromCallable(new Callable<List<Chat>>() {
@Override
public List<Chat> call() throws Exception {
return chatCloudData.getChats(userId, chatIds, chatsTimeStamp).subscribeOn(Schedulers.io())
.doOnNext(chats1 -> Log.i("chatRequest", TAG + " inside inside"));
}
});
}
}));
}
ChatCloudData
public List<Chat> getChats(int userId, ArrayList<String>
chatIds, HashMap<String, Long> chats) {
Log.i("chatRequest", TAG);
ChatsRequest chatsRequest = new ChatsRequest.Builder(userId)
.chatIDs(chatIds)
.chats(chats)
.build();
return apiService.getChats(chatsRequest);
}
端点
@POST("Chat/sync")
List<Chat> getChats(@Body ChatsRequest chatsRequest);
希望这对您有所帮助。
对不起我的英语。
return Observable.merge(chatDiskData.getChats().observeOn(AndroidSchedulers.mainThread()),
chatDiskData.getChats().observeOn(AndroidSchedulers.mainThread())
.flatMap(new Function<RealmResults<Chat>, ObservableSource<List<Chat>>>() {
@Override
public ObservableSource<List<Chat>> apply(@NonNull RealmResults<Chat> chats) throws Exception {
Log.i("chatRequest", TAG + " inside");
ArrayList<String> chatIds = new ArrayList<>();
HashMap<String, Long> chatsTimeStamp = new HashMap<>();
for (int i = 0; i < chats.size(); i++) {
String chatId = chats.get(i).getChat_id();
chatIds.add(chatId);
long timestamp = chatDiskData.lastMessage(chatId);
chatsTimeStamp.put(chatId, timestamp);
}
return chatCloudData.getChats(userId, chatIds, chatsTimeStamp).subscribeOn(Schedulers.io())
.doOnNext(chats1 -> Log.i("chatRequest", TAG + " inside inside"));
}
}));
.observeOn(AndroidSchedulers.mainThread() 是我使用领域的重要部分,它在不同的线程上获取数据。