wake-up-neo.com

Retrofit in Android verwenden

Ich habe eine Android-App mit 3 Aktivitäten:

  1. Eine Login-Aktivität
  2. Eine Aufgabenaktivität, bei der alle Aufgaben eines Benutzers angezeigt werden (mithilfe eines Array-Adapters gefüllt)
  3. Eine task_details-Aktivität, die sich aus dem Klicken auf eine Aufgabe in der Liste ergibt

Ich muss REST Apis konsumieren. Die Recherche, die ich bisher durchgeführt habe, weist mich an, Retrofit zu verwenden. Ich habe die Verwendung überprüft und herausgefunden, dass:

  1. Legen Sie die Basis-URL in der Hauptaktivität fest (meine ist die Login-Aktivität).
  2. Ich muss eine API-Klasse erstellen und meine Funktionen mithilfe von Anmerkungen definieren.
  3. Verwenden Sie die Klasse Rest Adapter in der Aktivität und definieren Sie Callbacks.

Wäre meine App eine einzige Aktivitäts-App gewesen, hätte ich alles in meiner MainActivity.Java geknackt, aber ich weiß nicht, wie und wo ich den gesamten Code aus den Schritten 1, 2, 3 zur Verwendung in meinen 3 Aktivitäten platzieren sollte Hilfe, indem Sie erzählen, wie Retrofit in meiner App verwendet wird. Danke vielmals.

Insbesondere brauche ich Netzwerkanrufe an: 1. Melden Sie sich an 2. Holen Sie sich alle Aufgaben des Benutzers. Und für beide würde ich ein gegebenes REST api verwenden.

*********************************************
          Calling Api USing Retrofit
*********************************************
**Dependancies** :-
      implementation 'com.Android.support:recyclerview-v7:27.1.1'
        implementation 'com.squareup.picasso:picasso:2.5.2'
        implementation 'com.Android.support:cardview-v7:27.1.1'
    enter code here
**Model**
use the Pozo class

**Api Call**
 -> getLogin()    // use the method



  //API call for Login
    private void getLogin()
    {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        AsyncHttpClient client = new AsyncHttpClient();
        RequestParams requestParams = new RequestParams();
        requestParams.put("email_id", edit_email.getText().toString());
        requestParams.put("password", edit_password.getText().toString());
        Log.e("", "LOGIN URL==>" + Urls.LOGIN + requestParams);
        Log.d("device_token", "Device_ Token" + FirebaseInstanceId.getInstance().getToken());
        client.post(Urls.LOGIN, requestParams, new JsonHttpResponseHandler() {
            @Override
            public void onStart() {
                super.onStart();
                ShowProgress();
            }

            @Override
            public void onFinish() {
                super.onFinish();
                Hideprogress();

            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                super.onSuccess(statusCode, headers, response);
                Log.e("", "Login RESPONSE-" + response);
                Login login = new Gson().fromJson(String.valueOf(response), Login.class);
                edit_email.setText("");
                edit_password.setText("");
                if (login.getStatus().equals("true")) {
                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                    MDToast mdToast = MDToast.makeText(SignInActivity.this, String.valueOf("User Login Successfully!"),
                            MDToast.LENGTH_SHORT, MDToast.TYPE_SUCCESS);
                    mdToast.show();
                    Utils.WriteSharePrefrence(SignInActivity.this, Util_Main.Constant.EMAIL, login.getData().getEmailId());
                    Utils.WriteSharePrefrence(SignInActivity.this, Constant.USERID, login.getData().getId());

                    Utils.WriteSharePrefrence(SignInActivity.this, Constant.USERNAME, login.getData().getFirstName());
                    Utils.WriteSharePrefrence(SignInActivity.this, Constant.PROFILE, login.getData().getProfileImage());
                    hideKeyboard(SignInActivity.this);
                    Intent intent = new Intent(SignInActivity.this, DashboardActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(intent);
                    finish();
                } else {
                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                    MDToast mdToast = MDToast.makeText(SignInActivity.this, String.valueOf("Login Denied"),
                            MDToast.LENGTH_SHORT, MDToast.TYPE_ERROR);
                    mdToast.show();
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                super.onFailure(statusCode, headers, responseString, throwable);
                Log.e("", throwable.getMessage());
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                MDToast mdToast = MDToast.makeText(SignInActivity.this, "Something went wrong",
                        MDToast.LENGTH_SHORT, MDToast.TYPE_ERROR);
                mdToast.show();
            }
        });
    }
41
Stack Man

Die Verwendung von Retrofit ist recht einfach und unkompliziert. 

Zunächst müssen Sie Ihrem Projekt ein Retrofit hinzufügen, beispielsweise mit dem Gradle-Build-System. 

compile 'com.squareup.retrofit:retrofit:1.7.1' |

auf andere Weise können Sie .jar herunterladen und in Ihrem libs-Ordner ablegen. 

Anschließend müssen Sie Schnittstellen definieren, die von Retrofit verwendet werden, um API-Aufrufe an Ihre REST -Endpunkte durchzuführen. Zum Beispiel für Benutzer: 

public interface YourUsersApi {

   //You can use rx.Java for sophisticated composition of requests 
   @GET("/users/{user}")
   public Observable<SomeUserModel> fetchUser(@Path("user") String user);

   //or you can just get your model if you use json api
   @GET("/users/{user}")
   public SomeUserModel fetchUser(@Path("user") String user);

   //or if there are some special cases you can process your response manually 
   @GET("/users/{user}")
   public Response fetchUser(@Path("user") String user);

}

OK. Jetzt haben Sie Ihre API-Schnittstelle definiert und können versuchen, sie zu verwenden. 

Um zu starten, müssen Sie eine Instanz vonRestAdaptererstellen und die Basis-URL Ihres API-Back-End festlegen. Es ist auch ganz einfach: 

RestAdapter restAdapter = new RestAdapter.Builder()
   .setEndpoint("https://yourserveraddress.com")
    .build();

YourUsersApi yourUsersApi = restAdapter.create(YourUsersApi.class);

Hier liest Retrofit Ihre Informationen aus der Benutzeroberfläche und erstellt unter der HaubeRestHandlerentsprechend der von Ihnen bereitgestellten Meta-Info, die tatsächlich HTTP-Anforderungen ausführt. 

Nach der Beantwortung werden Ihre Daten im Fall von json api mithilfe der Gson-Bibliothek in Ihr Modell umgewandelt. Sie sollten sich also der Tatsache bewusst sein, dass Einschränkungen in Gson in Retrofit vorhanden sind. 

Um den Prozess der Serialisierer/Deserialisierung Ihrer Antwortdaten auf Ihre Modelle zu erweitern/überschreiben, möchten Sie möglicherweise Ihre eigenen Serialisierer/Deserialisierer zum Nachrüsten bereitstellen.

Hier müssen Sie das Konverter-Interface implementieren und die 2 MethodenfromBody ()undtoBody ()implementieren.

Hier ist ein Beispiel: 

public class SomeCustomRetrofitConverter implements Converter {

    private GsonBuilder gb;

    public SomeCustomRetrofitConverter() {
        gb = new GsonBuilder();

        //register your cursom custom type serialisers/deserialisers if needed
        gb.registerTypeAdapter(SomeCutsomType.class, new SomeCutsomTypeDeserializer());
    }

    public static final String ENCODING = "UTF-8";

    @Override
    public Object fromBody(TypedInput body, Type type) throws ConversionException {
        String charset = "UTF-8";
        if (body.mimeType() != null) {
            charset = MimeUtil.parseCharset(body.mimeType());
        }
        InputStreamReader isr = null;
        try {
           isr = new InputStreamReader(body.in(), charset);
           Gson gson = gb.create();
           return gson.fromJson(isr, type);
        } catch (IOException e) {
            throw new ConversionException(e);
        } catch (JsonParseException e) {
            throw new ConversionException(e);
        } finally {
            if (isr != null) {
                   try {
                      isr.close();
                   } catch (IOException ignored) {
                }
            }
        }
    }

    @Override
    public TypedOutput toBody(Object object) {
        try {
            Gson gson = gb.create();
            return new JsonTypedOutput(gson.toJson(object).getBytes(ENCODING), ENCODING);
        } catch (UnsupportedEncodingException e) {
            throw new AssertionError(e);
        }
     }

    private static class JsonTypedOutput implements TypedOutput {
        private final byte[] jsonBytes;
        private final String mimeType;

        JsonTypedOutput(byte[] jsonBytes, String encode) {
            this.jsonBytes = jsonBytes;
            this.mimeType = "application/json; charset=" + encode;
        }

        @Override
        public String fileName() {
            return null;
        }

       @Override
       public String mimeType() {
           return mimeType;
       }

       @Override
       public long length() {
          return jsonBytes.length;
       }

       @Override
       public void writeTo(OutputStream out) throws IOException {
           out.write(jsonBytes);
       }
    }
 }

Und jetzt müssen Sie Ihre benutzerdefinierten Adapter aktivieren, falls dies erforderlich war, indem SiesetConverter ()beim Erstellen von RestAdapter verwenden 

OK. Nun wissen Sie, wie Sie Ihre Daten vom Server in Ihre Android-Anwendung übertragen können. Sie müssen jedoch Ihre Daten irgendwie verwalten und den REST - Aufruf an der richtigen Stelle aufrufen. Ich würde vorschlagen, Android Service oder AsyncTask oder Loader oder rx.Java zu verwenden, die Ihre Daten im Hintergrund-Thread abfragen, um Ihre Benutzeroberfläche nicht zu blockieren. 

So können Sie jetzt den am besten geeigneten Ort für einen Anruf finden 

SomeUserModel yourUser = yourUsersApi.fetchUser("someUsers")

um Ihre Remote-Daten abzurufen.

94
Artemis

Ich habe Retrofit gerade für ein paar Wochen verwendet und es fiel mir zunächst schwer, es in meiner Anwendung zu verwenden. Ich möchte Ihnen die einfachste Möglichkeit mitteilen, Retrofit in Ihrer Anwendung zu verwenden. Und wenn Sie sich später bereits gut mit Retrofit auskennen, können Sie Ihre Codes verbessern (indem Sie Ihre Benutzeroberfläche von API trennen und Callbacks verwenden). Vielleicht erhalten Sie auch einige Techniken aus dem obigen Beitrag.

In Ihrer App haben Sie Login, Aktivität für Aufgabenliste und Aktivität zum Anzeigen detaillierter Aufgaben.

Als Erstes müssen Sie Retrofit in Ihre App einfügen. Es gibt zwei Möglichkeiten, den @artemis-Beitrag oben zu befolgen.

Retrofit verwendet eine Schnittstelle als API. Erstellen Sie also eine Schnittstellenklasse.

public interface MyApi{

/*LOGIN*/
@GET("/api_reciever/login") //your login function in your api
public void login(@Query("username") String username,@Query("password") String password,Callback<String> calback); //this is for your login, and you can used String as response or you can use a POJO, retrofit is very rubust to convert JSON to POJO

/*GET LIST*/
@GET("/api_reciever/getlist") //a function in your api to get all the list
public void getTaskList(@Query("user_uuid") String user_uuid,Callback<ArrayList<Task>> callback); //this is an example of response POJO - make sure your variable name is the same with your json tagging

/*GET LIST*/
@GET("/api_reciever/getlistdetails") //a function in your api to get all the list
public void getTaskDetail(@Query("task_uuid") String task_uuid,Callback<Task> callback);   //this is an example of response POJO - make sure your variable name is the same with your json tagging

}

Erstellen Sie eine andere Schnittstellenklasse, um alle Ihre Basisadresse Ihrer API zu speichern

public interface Constants{
   public String URL = "www.yoururl.com"
}

Erstellen Sie in Ihrer Anmeldeaktivität eine Methode für die Nachrüstung

private void myLogin(String username,String password){

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint(Constants.URL)  //call your base url
    .build();


MyApi mylogin = restAdapter.create(MyApi.class); //this is how retrofit create your api
mylogin.login(username,password,new Callback<String>() {
        @Override
        public void success(String s, Response response) {
            //process your response if login successfull you can call Intent and launch your main activity

        }

        @Override
        public void failure(RetrofitError retrofitError) {
            retrofitError.printStackTrace(); //to see if you have errors
        }
    });
}

In Ihrer MainActivityList

private void myList(String user_uuid){

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint(Constants.URL)  //call your base url
    .build();


MyApi mytask = restAdapter.create(MyApi.class); //this is how retrofit create your api
mytask.getTaskDetail(user_uuid,new Callback<Task>>() {
        @Override
        public void success(ArrayList<Task> list, Response response) {
            //process your response if successful load the list in your listview adapter

        }

        @Override
        public void failure(RetrofitError retrofitError) {
            retrofitError.printStackTrace(); //to see if you have errors
        }
    });
}

In Ihrer detaillierten Liste

private void myDetailed(String task_uuid){

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint(Constants.URL)  //call your base url
    .build();


MyApi mytask = restAdapter.create(MyApi.class); //this is how retrofit create your api
mytask.getTaskList(task_uuid,new Callback<Task>() {
        @Override
        public void success(Task task, Response response) {
            //process your response if successful do what you want in your task

        }

        @Override
        public void failure(RetrofitError retrofitError) {
            retrofitError.printStackTrace(); //to see if you have errors
        }
    });
}

Ich hoffe, dies würde Ihnen helfen, obwohl es wirklich die einfachste Möglichkeit ist, Retrofit zu verwenden. 

24
chkm8

Sehen Sie sich dieses exzellente Blog über die Verwendung von Retrofit in Verbindung mit Otto an. Beide Bibliotheken stammen von Square.

http://www.mdswanson.com/blog/2014/04/07/durable-Android-restclients.html

Die Grundidee ist, dass Sie einen Verweis auf ein "Repository" -Objekt in Ihrer Application-Klasse halten. Dieses Objekt wird über Methoden verfügen, die "restliche" API-Ereignisanforderungen "abonnieren". Wenn eine empfangen wird, wird der entsprechende Retrofit-Anruf getätigt und dann die Antwort "gebucht", die dann von einer anderen Komponente "abonniert" werden kann (z. B. der Aktivität, die die Anforderung ausgeführt hat).

Sobald Sie alles richtig eingerichtet haben, ist der Zugriff auf Daten über Ihre Rest-API sehr einfach. Zum Beispiel würde die Anforderung von Daten ungefähr so ​​aussehen:

    mBus.post(new GetMicropostsRequest(mUserId));

und das Verbrauchen der Daten würde ungefähr so ​​aussehen:

@Subscribe
public void onGetUserProfileResponse(GetUserProfileResponse event) {
    mView.setUserIcon("http://www.gravatar.com/avatar/" + event.getGravatar_id());
    mView.setUserName(event.getName());

}

Es erfordert ein bisschen Vorarbeit, aber am Ende wird es "trivial", über Rest auf alles zuzugreifen, was Sie von unserem Backend benötigen.

4
nPn

Die Verwendung von RetroFit ist sehr einfach. 

  • Fügen Sie dependecy in build.gradle hinzu. 

        compile 'com.squareup.retrofit:retrofit:1.9.0'
    
        compile 'com.squareup.okhttp:okhttp:2.4.0' 
    
  • Erstellen Sie eine Schnittstelle für alle http-Methoden.

  • Kopieren Sie Ihre Json-Ausgabe und erstellen Sie eine Pojo-Klasse, um Json von Ihrer zu erhalten
    Antwort können Sie Pojo von JsonSchema2pojo site machen.

  • machen Sie einen Adapter und rufen Sie Ihre Methode auf

    für eine vollständige Demo versuchen Sie dieses Tutorial Retrofit Android Beispiel

3
kundan roy

Sie können versuchen, Verweise auf Ihre API innerhalb Ihrer Anwendungsklasse zu speichern. Dann können Sie die Instanz von jeder Aktivität oder einem Fragment erhalten und ein API von dort erhalten. Das hört sich etwas komisch an, kann aber eine einfache DI-Alternative sein. Wenn Sie nur Referenzen in Ihrer App-Klasse speichern, ist dies keine Art von Objekt

UPD: http://square.github.io/retrofit/ - Hier sind einige Dokumentationen, die möglicherweise nützlich sind

3
mr. Nutscracker

Erstens, alles in MainActivity zu setzen, wäre eine schlechte Praxis und Sie würden mit einem Gott-Objekt enden.

Die Dokumentation auf der Retrofit-Site ist fantastisch, deshalb werde ich Ihre Frage zur Strukturierung des Projekts lesen. Ich habe eine sehr kleine App zu Demonstrationszwecken geschrieben. Es lädt Katzen von der Katzen-API und sollte ziemlich einfach zu verfolgen sein, was passiert.

Es gibt ein Beispiel für die Verwendung von JSON oder XML für die Analyse von Daten aus dem Dienst. Sie finden es unter https://github.com/codepath/Android_guides/wiki/Consuming-APIs-with-Retrofit

Hoffentlich können Sie extrapolieren, warum ich es so strukturiert habe wie ich. Gerne beantworte ich Ihre Fragen in den Kommentaren und aktualisiere die Antwort.

2
Ben Pearson

Testen Sie diese App, die die Integration von Retrofit in die Google Tasks-API demonstriert.

https://github.com/sschendel/SyncManagerAndroid-DemoGoogleTasks

Es gibt Beispiele für Retrofit-API (TaskApi), die in Activity AsyncTask in MainActivity verwendet werden, sowie Beispiele für die Verwendung von Sync Adapter im Hintergrunddienst.

Die Strategie aus dem in @ nPn's Antwort veröffentlichten Artikel ist wahrscheinlich eine elegantere Lösung, aber Sie können sich zumindest ein anderes Arbeitsbeispiel ansehen.

2
Sean

Ich finde diese Tutorials AndroidHive , CodePath hilfreich

Ich werde kurz beschreiben, was ich gelernt habe.

Schritt 1: Diese drei dependencies to build.gradle hinzufügen und Internet permission zu Manifest hinzufügen

compile 'com.google.code.gson:gson:2.6.2' // for string to class conversion. Not Compulsory
compile 'com.squareup.retrofit2:retrofit:2.1.0'// compulsory
compile 'com.squareup.retrofit2:converter-gson:2.1.0' //for retrofit conversion

Fügen Sie sie in Manifest hinzu

<uses-permission Android:name="Android.permission.INTERNET" />

Schritt 2 Creae ApiClient und ApiInterface.

public class ApiClient {

    public static final String BASE_URL = "http://yourwebsite/services/";
    private static Retrofit retrofit = null;

    public static Retrofit getClient() {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

wobei ApiInterface.class

public interface ApiInterface {

    // getting same data in three different ways.
    @GET("GetCompanyDetailByID")
    Call<CompanyResponse> getDetailOfComapanies(@Query("CompanyID") int companyID);


    @GET("GetCompanyDetailByID")
    Call<ResponseBody> getRawDetailOfCompanies(@Query("CompanyID") int companyID);

    @GET("{pathToAdd}")
    Call<CompanyResponse> getDetailOfComapaniesWithPath(@Path("pathToAdd") String pathToAppend, @Query("CompanyID") int companyID);
}

Und diesen Service gerne anrufen

ApiInterface apiService =
                ApiClient.getClient().create(ApiInterface.class);

        Call<CompanyResponse> companyResponseCall = apiService.getDetailOfComapanies(2);
        //Call<CompanyResponse> companyResponseCall = apiService.getDetailOfComapaniesWithPath("GetCompanyDetailByID",2);

        companyResponseCall.enqueue(new Callback<CompanyResponse>() {
            @Override
            public void onResponse(Call<CompanyResponse> call, Response<CompanyResponse> response) {
                CompanyResponse comapnyResponse = response.body();
                Boolean status  = comapnyResponse.getStatus();
            }

            @Override
            public void onFailure(Call<CompanyResponse> call, Throwable t) {
            }
        });

Für das Erhalten von Raw Json String 

Call<ResponseBody> call = apiService.getRawDetailOfCompanies(2);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    String jsonStr = response.body().string();
                    if(!jsonStr.isEmpty()){
                        Gson gson = new Gson();

                        JSONObject jObject = new JSONObject(jsonStr).getJSONObject("data");

                        //1st Method
                        Data dataKiType = gson.fromJson(jObject.toString(), Data.class);
                        dataKiType.getCompanyDetail();

                        //2nd method for creaing class or List at runTime
                        Type listType = new TypeToken<Data>(){}.getType();
                        Data yourClassList = new Gson().fromJson(jObject.toString(), listType);
                        yourClassList.getCompanyDetail();
                    }  e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });

Sie können Ihr Geschäftsobjekt mit http://www.jsonschema2pojo.org/ erstellen, indem Sie einfach json einfügen. und Auswählen des Quelltyps für JSON und Anmerkungsstil für GSon

2
Xar E Ahmer

Ein kleines, aber vollständiges und prägnantes Beispiel finden Sie unter https://github.com/square/retrofit/tree/master/samples

1
GreyBeardedGeek

Anfänger finden es wenig einschüchternd, Retrofit zu lernen. Ich habe ein Tutorial vorbereitet, das die Lernkurve vereinfacht. Weitere Informationen finden Sie in Retrofit Android Tutorial .

1

Fügen Sie diese Zeilen zunächst der Gradle-Datei hinzu

compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.google.code.gson:gson:2.7'
    compile 'com.squareup:otto:1.3.8'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

Erstellen Sie dann Objekte in OnCreate of Activity

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);    
OkHttpClient client= new OkHttpClient
                .Builder()
                .connectTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .addInterceptor(interceptor).build();
Gson gson=new GsonBuilder()
          .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
          .create();
Retrofit retrofit= new Retrofit.Builder()
                .baseUrl("url")
                .client(client)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

Erstellen Sie ein Iterface

public interface summaryListAPI {
//post
    @FormUrlEncoded
    @POST("index.php")
    Call<summaryList> post(
            @Field("status") String status,
            @Field("sox") String sox
    );
//get
@GET("yesbdeChatHistoryList/{userId}/")
    Call<List<ChatTabTwoResp>> getFriends(
            @Path("userId") int userId
    );
}

Klassen erstellen

public class summaryList {
    @SerializedName("bookingSummary") @Expose private List<summaryListData> status = new ArrayList<summaryListData>();
}   

public class summaryListData {
    @SerializedName("date") @Expose private String date;
}

Fügen Sie diese Methode Ihrer Aktivität hinzu

 public void apiSummaryListMain(final Retrofit retrofit) {
        retrofit.create(summaryListAPI.class).post("8547861657","100").enqueue(new Callback<summaryList>() {
            @Override
            public void onResponse(Call<summaryList> call, Response<summaryList> response) {
                if (response.isSuccessful()) {
                    progressBar.setVisibility(View.INVISIBLE);
                     List<summaryListData> summary_List= response.body().getStatus();                   
                }else{              
                }
            }
            @Override
            public void onFailure(Call<summaryList> call, Throwable t) {

            }
        });

    }
1
jojo
public interface APIService {

    @POST(Constant.updateProfile)
    @FormUrlEncoded
    Call<ResponseBody> updateProfile(
            @Field("user_id") String user_id,
            @Field("first_name") String first_name,
            @Field("last_name") String last_name
    );
}

public class RetrofitClient {
    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl) {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }

}


public class Body {


// Check Status if Status True or False
String status;
String message;
String checksum;
  
}



public interface OnBodyResponseListner {


public void onSucces(Body response);
public void onFailure(Body response);
public void onBlankBody(Call<ResponseBody> call);

}

 public static void setOnWebServiceCallListner(final Call<ResponseBody> t, final OnBodyResponseListner onBodyResponseListner) {
    t.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            try {
                call.cancel();
                Gson gson = new GsonBuilder().serializeNulls().create();
                String json = response.body().string();
                Log.d(TAG, json + "  ~ Response ~  " + json);
                Body body = gson.fromJson(json, Body.class);

                if (body.getStatus().equalsIgnoreCase("true")) {
                    onBodyResponseListner.onSucces(body);
                } else {
                    onBodyResponseListner.onFailure(body);
                }


            } catch (Exception e) {
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            onBodyResponseListner.onBlankBody(call);
            Log.d(TAG, "~ Response Message Blank ~ " + t.getMessage() + " \n Localize Message ~ " + t.getLocalizedMessage() + " \n" + t.getStackTrace().toString());
        }
    });


}


 APIService mService = RetrofitClient.getClient(Constant.BASE_URL).create(APIService.class);


Oprations.setOnWebServiceCallListner(mService.updateProfile("12",
            "first_name",
            "last,name"
    ), new OnBodyResponseListner() {
        @Override
        public void onSucces(Body response) {
            
           

        }

        @Override
        public void onFailure(Body response) {
            
            Toast.makeText(mContext, response.getMessage(), Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onBlankBody(Call<ResponseBody> call) {

        }
    });
}
0
CHirag RAmi

Die Entwicklung einer eigenen typsicheren HTTP-Bibliothek für die Schnittstelle mit einer REST - API kann sehr schwierig sein: Sie müssen mit vielen Aspekten umgehen, z Handhabung und mehr. Retrofit dagegen ist eine gut geplante, dokumentierte und getestete Bibliothek, die Ihnen wertvolle Zeit und Kopfschmerzen erspart.

"com.google.code.gson: gson: 2.6.2" kompilieren 

compile 'com.squareup.retrofit2: Retrofit: 2.1.0' // obligatorisch

kompilieren Sie 'com.squareup.retrofit2: converter-gson: 2.1.0' // zur Konvertierung nachträglich

0
Keshav Gera

Einfache Nachrüstung + okhttp-Integration mit RxJava

public WebService apiService(Context context) {
    String mBaseUrl = context.getString(BuildConfig.DEBUG ? R.string.local_url : R.string.live_url);

    int cacheSize = 5 * 1024 * 1024; // 5 MB
    Cache cache = new Cache(context.getCacheDir(), cacheSize);

    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
    loggingInterceptor.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE);

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .readTimeout(120, TimeUnit.SECONDS)
            .writeTimeout(120, TimeUnit.SECONDS)
            .connectTimeout(120, TimeUnit.SECONDS)
            .addInterceptor(loggingInterceptor)
            //.addNetworkInterceptor(networkInterceptor)
            .cache(cache)
            .build();

    return new Retrofit.Builder().baseUrl(mBaseUrl)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build().create(WebService.class);

}
0
Aks4125

Es funktioniert

 enter image description here Paket com.keshav.gmailretrofitexampleworking.network;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ApiClient {
    public static final String BASE_URL = "http://api.androidhive.info/json/";
    private static Retrofit retrofit = null;

    public static Retrofit getClient() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}
==============================================
package com.keshav.gmailretrofitexampleworking.network;

import com.keshav.gmailretrofitexampleworking.models.Message;

import Java.util.List;

import retrofit2.Call;
import retrofit2.http.GET;

public interface ApiInterface {
    @GET("inbox.json")
    Call<List<Message>> getInbox();
}

"com.google.code.gson: gson: 2.6.2" kompilieren

compile 'com.squareup.retrofit2:retrofit:2.0.2'

compile 'com.squareup.retrofit2:converter-gson:2.0.2'

================================================== ===

Rufen Sie Retrofit 2 APi in onCreate auf

private void getInbox() {
    swipeRefreshLayout.setRefreshing(true);

    ApiInterface apiService =
            ApiClient.getClient().create(ApiInterface.class);

    Call<List<Message>> call = apiService.getInbox();
    call.enqueue(new Callback<List<Message>>() {
        @Override
        public void onResponse(Call<List<Message>> call, Response<List<Message>> response) {
            // clear the inbox
            messages.clear();

            // add all the messages
            // messages.addAll(response.body());

            // TODO - avoid looping
            // the loop was performed to add colors to each message

            Log.e("keshav","response" +response.body());

            for (Message message : response.body()) {
                // generate a random color

                // TODO keshav Generate Random Color Here
                message.setColor(getRandomMaterialColor("400"));
                messages.add(message);
            }

            mAdapter.notifyDataSetChanged();
            swipeRefreshLayout.setRefreshing(false);
        }

        @Override
        public void onFailure(Call<List<Message>> call, Throwable t) {
            Toast.makeText(getApplicationContext(), "Unable to fetch json: " + t.getMessage(), Toast.LENGTH_LONG).show();
            swipeRefreshLayout.setRefreshing(false);
        }
    });
}

Quellcode https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0JabUU

https://drive.google.com/open?id=0BzBKpZ4nzNzUc2FBdW00WkRfWW8

0
Keshav Gera

Ich habe dieses Problem auf eine sehr einfache Art und Weise gebremst, Sie müssen nur ein Plugin installieren und einige Schritte ausführen, um die Nachrüstung in einer beliebigen App durchzuführen:

Bereits gepostete Antwort: Retrofit in Android?

Fügen Sie das Android Plugin (QAssist - Android Studio Plugin) in Ihrem Android Studio hinzu. ( https://github.com/sakkeerhussain/QAssist ).

Hoffe, das wird dir helfen.

0
A-Droid Tech