2016-07-26 13 views
0

Ich habe ähnliche Fragen wie diese gesucht, aber leider fand ich sie wirklich verwirrend und auch ich bin noch neu auf Android und Retrofit.Android Retrofit 1.9 return ListString nach Erfolg

Ich habe eine Kontaktliste JSON hier

http://api.androidhive.info/contacts/ 

Und schon Arbeitsliste, aber dann wollte ich den Retrofit-Prozess in einer anderen Klasse behandeln, damit ich es einfach anrufen kann, wann immer ich will. Ich habe die MainActivity für die Benutzeroberfläche und den RetrofitHandler aufrufen, die die Erfolgs- und Fehlermethode behandelt.

Hier ist meine Hauptaktivität

public class MainActivity extends AppCompatActivity{ 

//note i just simplifiend my code a little 

private List<Contacts> contacts; 
public String[] itemer; 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    RetrofitHandler retrofitHandler = new RetrofitHandler(); 

    itemer = retrofitHandler.getContacts(this); 

    if (itemer != null) { 
     Toast.makeText(MainActivity.this,itemer[0],Toast.LENGTH_SHORT).show(); 

    } 

} 

Und hier ist mein HandlerClass

ublic class RetrofitHandler { 
public String[] item; 
public static final String ROOT_URL = "http://api.androidhive.info"; 
public List<Contacts> contacts; 

public String[] getContacts(final Context context) { 
    final ProgressDialog loading = ProgressDialog.show(context, "Fetching Data", "Please wait...", false, false); 

    RestAdapter adapter = new RestAdapter.Builder().setEndpoint(ROOT_URL).build(); 
    ContactsAPI api = adapter.create(ContactsAPI.class); 

    api.getContacts(new Callback<Contacts>() { 
     @Override 
     public void success(Contacts contacts, Response response) { 
      loading.dismiss(); 
      MainActivity update = new MainActivity(); 
      List<Contact> contactList = contacts.getContacts(); 


      item = new String[contactList.size()]; 

      for (int i = 0; i < contactList.size(); i++) { 

       item[i] = contactList.get(i).getName(); 
      } 

     } 

     @Override 
     public void failure(RetrofitError error) { 
      Toast.makeText(context, "Error Occured", Toast.LENGTH_LONG).show(); 
     } 

    }); 
    return item; 
} 

Mein Problem ist, es läuft ohne Fehler auf LogCat. Leider wird der Toast auf der Hauptaktivität nicht angezeigt.

+0

ist ein Netzwerk-Anruf, könnte es Haupt-Thread und Hintergrund Thema Problem, Also warum kann man nicht vom Ende der Erfolg-Funktion Toast. Überprüfen Sie auch, ob die Antwort, die Sie erhalten, Null ist oder nicht –

+0

@mohitsharma Nun der Toast auf Erfolg ist, was ich erreicht habe, aber ursprünglich möchte ich Mai Elemente auf einer Listview von der Hauptaktivität die Elemente auf Erfolg ist nicht null, ich habe es getestet mit dem Toast – user3262438

+0

versuchen, zu überprüfen: Wenn Ihre Bedingung ausgeführt wird oder nicht, versuchen Sie eine Println innerhalb, wenn Block und ändern Sie die Bedingung in iterer.length/size –

Antwort

0

Ihr Problem liegt an der asynchronen Art der Anfrage/Antwort. Erfolgs- oder Fehlerrückrufe werden bei einer Antwort ausgelöst, die asynchron erfolgt. Also im Grunde Ihre Methode zurück, bevor das passiert, bedeutet es, dass Ihr Artikel null ist. Sie müssen synchronen Mechanismus verwenden oder Sie müssen MVP pattern überprüfen, die perfekte Lösung für Ihr Problem gibt. Siehe unten ist ein Beispiel für synchrone Anrufe (ich habe es nicht getestet, aber es sollte funktionieren).

public List<Contacts> getContacts(){ 
    RestAdapter adapter = new RestAdapter.Builder().setEndpoint(ROOT_URL).build(); 
    ContactsAPI api = adapter.create(ContactsAPI.class); 
    return api.getContacts(); 
} 

Sehen Sie diese tutorial, um mehr Idee zu bekommen. Ich schlage vor, Sie zu Retrofit 2 verschieben, die viel größer ist als Retrofit 1.