2017-01-02 2 views
0

Ich versuche, Beiträge aus Blog zu laden. Ich benutze Mosby + Retrofit + rxjava.Laden Sie mehr auf Retrofit und 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 
       )); 
    } 
} 

und api

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

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

erste Abfrage Website ist ok. https://site/posts?last_id=0

Aber zweiten Lauf Funktion getList funktioniert nicht. i https://site/posts?last_id=1000

aktualisieren echte Abfrage-String bekommen Ich bekomme immer die gleiche get-Abfrage mit last_id = 0, aber Zeile in der Konsole Schreib

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

wenn ich schreibe

tmp = api.getPostList(1000) 

dann Ich schreibe Code-Repository neu.

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 
       )); 
    } 
} 

Es ist Arbeit

Antwort

1

Ihr Problem in diesem Codefragment liegt:

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

Operatoren auf Observablen ausführen unveränderlich Operationen, was bedeutet, dass es gibt immer neue Stream das ist eine modifizierte Version des vorherigen. Das heißt, wenn Sie den Operator mergeWith anwenden, wird das Ergebnis verworfen, da Sie es nirgendwo speichern. Am einfachsten ist es, die alte postList-Variable durch den neuen zu ersetzen.

Dies ist jedoch nicht der optimale Weg. Sie sollten sich die Themen ansehen und neue Werte innerhalb des alten Streams ausgeben, da Ihre aktuelle Lösung die vorherigen Abonnenten nicht beeinflusst, da sie einen anderen Stream abonniert haben

Verwandte Themen