2017-12-15 9 views
1

Ok Ich bin ziemlich neu in Android und reaktive Programmierung und ich habe in den letzten zwei Tagen versucht, eine Aktivität zu machen, die Beiträge von einem Server erhält und lädt sie in eine Post [ ] das wird später in meiner App verwendet. Das Problem hier ist, dass, wenn ich diesen Post [] an die displayPostsMethod übergeben, es null ist. Hier ist der Code in der AktivitätRxAndroid 2.0.1 Subscribe-Methode setzt keine Variable

public class HomeActivity extends AppCompatActivity{ 
     private Post[] postsToDisplay; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_home); 

       //get the posts from the server 
       this.getPostsFromServer(); 

       //dispaly the posts 
       this.displayPosts(posts);// here are the posts null 
     } 

     public void getPostsFromServer() { 
       PostsProvider.getAllPosts() 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(posts -> { 
        this.postsToDispaly = Arrays.copyOf(posts, posts.length); 
       }); 
     } 
    } 

Und hier ist auch der Code aus der getAllPostsMethod in PostsProvider Klasse.

public static Observable<Post[]> getAllPosts(){ 
    return Observable.create((ObservableEmitter<Post[]> e) -> { 
     OkHttpClient client = new OkHttpClient(); 

     Request request = new Request.Builder() 
      .url("sample url") 
      .build(); 

     Response response = client.newCall(request).execute(); 

     String json = response.body().string(); 

     Gson gson = new Gson(); 

     Post[] posts = gson.fromJson(json, Post[].class); 
     e.onNext(posts); 
    }); 
    } 
+0

Können Sie Ihren JSON? –

+0

Ich denke nicht, dass es von der JSON ist, weil ich versuchte, okhttp überhaupt nicht zu verwenden und jsut emitt hardcoded Post [] in der GetAllPosts() und es tut immer noch das gleiche. –

+0

Also haben Sie versucht, 'this.displayPosts (posts);' nach unten von 'this.postsToDispaly = Arrays.copyOf (posts, posts.length);'? –

Antwort

2

Überprüfen Sie zuerst die Reihenfolge der Zeilen unter

//get the posts from the server 
this.getPostsFromServer(); 

//dispaly the posts 
this.displayPosts(posts); 

ok, so dass Sie ‚getPostFromServer‘ Methode sind aufrufen und dann displayPosts aber die Sache ist getPostFromServer ist wie ein AsnycTask es in der ausgeführt wird Hintergrund aufgrund dieser Linie

.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(posts -> { 
     this.postsToDispaly = Arrays.copyOf(posts, posts.length); 
}); 

Hier in RxJava abonnieren auf sagt-> ich möchte die obigen Zeilen im Hintergrund (Schedulers.io() auf io Gewinde) und o laufen bserveOn (Hauptthread) und wenn Sie die Sache abonnieren, ist es äquivalent zum Aufruf in async Aufgabe auszuführen

So Android-System wird ausgeführt und Ergebnisse im Hintergrund, so dass eine andere Methode (Display Post) wird nicht die Beiträge auf einmal sein Check diese Logik durch Protokolle in Methoden hinzufügen Post abonnieren und anzeigen Zeitergebnis erhalten

besser Sie anzeigen Beiträge aufrufen können von abonnieren wie diese

.subscribe(posts -> { 
       if(posts!=null)//check i think null will not be received in Rxjava 2.0 so also add error method in which you can show no result to be displayed 
       displayPosts(posts); 
      },err->{//add no posts found here and dismiss progress dialog/progress bar 
        err.printStackTrace(); 
       }); 

und bis Sie API nennt man Fortschritt Dialog zeigen können, oder Fortschrittsbalken

Überprüfen Sie, wie Threading-System funktioniert und es ist die gleiche Logik in RxJava also, wenn Sie AsyncTask und DoInBackground grundlegende Logik ist die gleiche, um etwas im Hintergrund ohne Benutzer Interaktionen zu stoppen.

+0

Ich hoffe, dass Ihre Frage gelöst ist, wenn nicht kommentieren ich werde Ihnen helfen –

+0

ok, aber was ist, wenn ich die Daten speichern möchte, die ich von der subscribe() und dann verwenden Zum Beispiel, um es irgendwo zu übergeben. Auch vielleicht mache ich etwas falsch, aber es wirft immer noch NullPointerException. Ist es besser, AsuncTask mit doInBackground zu verwenden –

+0

können Sie hier debuggen Post [] Beiträge = gson.fromJson (json, Post []. Klasse); e.onNext (Beiträge); Ich glaube nicht, dass Sie Beiträge von hier erhalten print JSON und Beiträge in der obigen Zeile vor onNext() und was ist der genaue Fehler? –