2017-01-02 3 views
0

Я пробовал загрузочные сообщения из блога. Я использую mosby + retrofit + rxjava.Загрузите больше на retrofit и rxJava

public class PostRepository implements IPostRepository { 

    private Api api; 

    private long last_id = 0; 
    private Single<List<Post>> postList; 

    public PostRepository(Api api) { 
     this.api = api; 
    } 

    @Override 
    public Single<List<Post>> getList() { 
     this.load(); 
     return postList; 
    } 

    private void load() { 
     Single<List<Post>> tmp; 
     Log.d(Configuration.DEBUG_TAG, "Loading " + last_id); 
     tmp = api.getPostList(last_id) 
      .map(posts -> { 
       ArrayList<Post> postList = new ArrayList<>(); 
       for (PostResponse post : posts) { 
        if (last_id == 0 || last_id > post.id) { 
         last_id = post.id; 
        } 
        postList.add(new Post(
          post.id, 
          post.thumb, 
          post.created_at, 
          post.title 
        )); 
       } 
       return postList; 
      }); 
     if (postList == null) { 
      postList = tmp; 
     } else { 
      postList.mergeWith(tmp); 
     } 
    } 

    @Override 
    public Single<Post> getDetail(long id) { 
     return api.getPost(id) 
       .map(postResponse -> new Post(
         postResponse.id, 
         postResponse.thumb, 
         postResponse.created_at, 
         postResponse.title, 
         postResponse.body 
       )); 
    } 
} 

и апи

public interface Api { 
    @GET("posts") 
    Single<PostListResponse> getPostList(@Query("last_id") long last_id); 

    @GET("post/{id}") 
    Single<PostResponse> getPost(@Path("id") long id); 
} 

Первый запрос на веб-сайте в порядке. https://site/posts?last_id=0

Но второй запуск функции getList не работает. я всегда получаю один и тот же получите запрос с last_id = 0, а строки в консоли записи

D/App: Loading 1416 
D/App: 1416 
D/OkHttp: --> GET https://site/posts?last_id=0 http/1.1 

если я пишу

tmp = api.getPostList(1000) 

тогда я получить истинную строку запроса https://site/posts?last_id=1000

Update Я переписываю репозиторий кода.

public class PostRepository implements IPostRepository { 

    private Api api; 

    private long last_id = 0; 
    private List<Post> postList = new ArrayList<>(); 
    private Observable<List<Post>> o; 

    public PostRepository(Api api) { 
     this.api = api; 
    } 

    @Override 
    public Single<List<Post>> getList() { 
     return load(); 
    } 

    private Single<List<Post>> load() { 
     return api.getPostList(last_id) 
      .map(posts -> { 
       for (PostResponse post : posts) { 
        if (last_id == 0 || last_id > post.id) { 
         last_id = post.id; 
        } 
        postList.add(new Post(
          post.id, 
          post.thumb, 
          post.created_at, 
          post.title 
        )); 
       } 
       return postList; 
      }); 
    } 

    @Override 
    public Single<Post> getDetail(long id) { 
     return api.getPost(id) 
       .map(postResponse -> new Post(
         postResponse.id, 
         postResponse.thumb, 
         postResponse.created_at, 
         postResponse.title, 
         postResponse.body 
       )); 
    } 
} 

Это работа

ответ

1

Ваша проблема заключается в этом фрагменте коды:

if (postList == null) { 
    postList = tmp; 
} else { 
    postList.mergeWith(tmp); // here 
} 

Операторы по наблюдаемым исполняющей неизменных операций, что означает, что она всегда возвращает нового потока, который является модифицированной версией предыдущего. Это означает, что когда вы применяете оператор mergeWith, результат этого отклоняется, поскольку вы его нигде не храните. Самое простое исправить это - заменить прежнюю переменную postList новым потоком.

Однако это не оптимальный способ сделать это. Вы должны взглянуть на темы и испустить новые значения в старом потоке, так как ваше текущее решение не повлияет на предыдущих подписчиков, поскольку они подписались на другой поток.

 Смежные вопросы

  • Нет связанных вопросов^_^