2017-01-17 2 views
0

Ich kann nicht die Daten außerhalb onResponse in Restrofit bekommenkann keine Daten außerhalb onResponse Retrofit bekommen

dies mein Code

List<Categorie> categorylist=new ArrayList<>(); 


    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(baseUrl) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    final CategoryApi api = retrofit.create(CategoryApi.class); 



    Call<List<Categorie>> categoryCall = api.categories(); 


     categoryCall.enqueue(new Callback<List<Categorie>>() { 
      @Override 
      public void onResponse(Call<List<Categorie>> call, Response<List<Categorie>> response) { 
       categorylist = (List<Categorie>)response.body(); 
       Log.i("success","Inside "+categorylist.toString()); 

       // here i get the data 

      } 

      @Override 
      public void onFailure(Call<List<Categorie>> call, Throwable t) { 
       System.out.println("Erreur"); 
      } 
     }); 

     Log.i("success","Outside "+categorylist.toString()); 

     // here i get null 

ich versucht habe zu machen Category volatil und statisch und es didn‘ t Arbeit

Antwort

0

Es scheint, Sie versuchen, auf categorylist sofort nach dem Aufruf categoryCall.enqueue zuzugreifen. enqueue ist ein asynchroner Vorgang, der nicht abgeschlossen wird, bevor die nächste Zeile (die categorylist.toString() enthält) ausgeführt wird.

Versuchen Sie eine andere Methode aufrufen, wo Sie den Kommentar verlassen haben

public void onResponse(/*...*/ response) { categorylist = (List<Categorie>)response.body(); Log.i("success","Inside "+categorylist.toString()); // here i get the data businessLogic(categorieslist); } private void businessLogc(List<Categorie> categories) { myView.showCategories(categories); // or whatever you're doing with data }

+0

Danke. Ich habe das schon ausprobiert und es funktioniert. Ich habe viele Methoden und ich brauche die Cetegorylist-Variable außerhalb des Rückrufs, damit ich es frei handhaben kann. –

0

Sie wissen, http-Request „hier ich die Daten erhalten“ ist ein Prozess, der Zeit erfordert, so dass es asynchron ausgeführt werden soll. Zum Glück kümmern wir uns um alles.

Wenn Sie eine Antwort von OnResponse erhalten, müssen Sie Ihre aktuelle Ansicht aktualisieren. Wenn Sie beispielsweise recyclerview verwenden, gibt es die Methode recyclerview.notifyDataSetChanged().

Wenn Sie das Ergebnis von Anfang an erhalten möchten. Ich schlage vor, dass Sie die Enqueue-Methode in anderen Aktivitäten oder woanders aufrufen, und wenn Sie das Ergebnis erhalten, speichern Sie es in der SQLite-Datenbank.

Und dann, wenn Sie CategoryActivity öffnen, laden Sie es aus der Datenbank.

Sie können die Schaltfläche zum Aktualisieren hinzufügen, um die Enqueue erneut aufzurufen, um die Datenbank zu aktualisieren.

Verwandte Themen