Es wäre schön, wenn Sie mir helfen würden, eine einfache API-GET-Methode mit Retrofit aufzurufen. Ich habe die Gson und Retrofit jar-Datei in dem Build-Pfad hinzugefügt.
Hier ist der interface
:
public interface MyInterface {
@GET("/my_api/shop_list")
Response getMyThing(@Query("mid") String param1);
}
Ich erhalte nur Ergebnisse (in log cat), wenn ich in AsyncTask Folgendes aufrufe, ansonsten erhalte ich NetworkOrMainThreadException
Wie soll ich das aufrufen?
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://IP:Port/")
.setLogLevel(RestAdapter.LogLevel.FULL).build();
MyInterface service = restAdapter
.create(MyInterface.class);
mResponse = service.getMyThing("455744");
return null;
}
Retrofit gibt Ihnen die Möglichkeit, synchrone und asynchrone. Abhängig davon, wie Sie Ihre Schnittstellenmethode deklarieren, ist sie entweder synchron oder asynchron.
public interface MyInterface {
// Synchronous declaration
@GET("/my_api/shop_list")
Response getMyThing1(@Query("mid") String param1);
// Asynchronous declaration
@GET("/my_api/shop_list")
void getMyThing2(@Query("mid") String param1, Callback<Response> callback);
}
Wenn Sie Ihre API erklären synchron dann werden Sie verantwortlich davon in einem Thread
Ausführung.
Bitte lesen Sie den Abschnitt "SYNCHRON VS. ASYNCHRON VS. OBSERVABLE" auf Retrofits Website . Dies erklärt Ihnen die Grundlagen zur Deklaration Ihrer APIs für Ihre unterschiedlichen Anforderungen.
Der einfachste Weg, auf Ihr JSON-Klassenobjekt zuzugreifen, besteht darin, es einem Java) -Objekt zuzuordnen und Retrofit die Konvertierung für Sie durchführen zu lassen.
Wenn zum Beispiel die zurückgegebene JSON für Ihre Rest-API war
[{"id":1, "name":"item1"}, {"id":2, "name":"item2"}]
Dann könnten Sie so eine Java
Klasse erstellen
public class Item {
public final int id;
public final String name;
public Item(int id, String name) {
this.id = id;
this.name = name;
}
}
Dann deklarieren Sie einfach Ihre API wie folgt
@GET("/my_api/shop_list")
void getMyThing(@Query("mid") String param1, Callback<List<Item>> callback); // Asynchronous
Und es verwenden
api.getMyThing("your_param_here", new Callback<List<Item>>() {
@Override
public void success(List<Item> shopList, Response response) {
// accecss the items from you shop list here
}
@Override
public void failure(RetrofitError error) {
}
});
Basierend auf dem JSON, den Sie in den Kommentaren angegeben haben, müssten Sie so etwas tun
public class MyThingResponse {
public InnerResponse response;
}
public class InnerResponse {
public String message;
public String status;
public List<Item> shop_list;
}
Das ist etwas hässlich, aber es liegt am JSON. Meine Empfehlung wäre, Ihre JSON zu vereinfachen, indem die „Antwort“ innere Objekt zu entfernen, wenn Sie können, wie so
{
"message": "Shops shown",
"status": 1,
"shop_list": [
{
"id": "1",
"city_id": "1",
"city_name": "cbe",
"store_name": "s"
}
]
}
Dann könnte Ihr POJO so einfacher werden
public class MyThingResponse {
public String message;
public String status;
public List<Item> shop_list;
}