Использование Retrofit в Android

У меня есть приложение для Android, которое имеет 3 действия:

  1. Активность входа в систему
  2. Выполнение задач, в которых отображаются все задачи, относящиеся к пользователю (заполняется с использованием адаптера массива)
  3. Активность task_details, которая возникает при нажатии задачи в списке

Я должен использовать REST Apis. Исследование, которое я сделал до сих пор, направляет меня на использование Retrofit. Я проверил, как его использовать, и выяснил, что:

  1. Задайте базовый URL-адрес в основной деятельности (Mine – это активность входа)
  2. Мне нужно создать class API и определить мои функции с помощью аннотаций.
  3. Используйте Адаптер restа classа в Управлении и определите Обратные вызовы.

Если бы мое приложение было одним активным приложением, я бы все хрустнул в моем MainActivity.java, но я не знаю, как и где поставить весь код из шагов 1,2,3 для использования в моих 3 действиях. Не могли бы вы помогите, рассказав, как использовать Retrofit в моем приложении. Большое спасибо.

В частности, мне нужны сетевые вызовы: 1. Войдите в систему пользователя 2. Получите все задачи пользователя. И для обоих я буду использовать данный REST api.

Использование Retrofit довольно просто и просто.

Прежде всего, вам нужно добавить модификацию в свой проект, например, с помощью системы Gradle build.

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

другим способом вы можете загрузить .jar и поместить его в свою папку libs.

Затем вам нужно определить интерфейсы, которые будут использоваться Retrofit для вызова API для ваших конечных точек REST. Например, для пользователей:

 public interface YourUsersApi { //You can use rx.java for sophisticated composition of requests @GET("/users/{user}") public Observable 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); } 

ОК. Теперь вы определили свой интерфейс API, и можете попробовать его использовать.

Для начала вам нужно создать экземпляр RestAdapter и установить базовый URL-адрес вашего API-интерфейса. Это также довольно просто:

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

Здесь Retrofit будет считывать вашу информацию из интерфейса и под капотом создаст RestHandler в соответствии с предоставленной вами метаинформацией, которая фактически будет выполнять HTTP-запросы.

Затем под капотом, как только будет получен ответ, в случае json api ваши данные будут преобразованы в вашу модель с использованием библиотеки Gson, поэтому вы должны знать об этом факте, что ограничения, присутствующие в Gson, действительно присутствуют в Retrofit.

Чтобы расширить / переопределить процесс сериализаторов / десериализации ваших данных ответа на ваши модели, вы можете захотеть предоставить свои собственные сериализаторы / десеризаторы для модернизации.

Здесь вам нужно реализовать интерфейс конвертера и реализовать 2 метода из Body () и toBody () .

Вот пример:

 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); } } } 

И теперь вам нужно включить свои пользовательские адаптеры, если это необходимо, используя setConverter () для сборки RestAdapter

ОК. Теперь вы знаете, как вы можете получать свои данные с сервера на свое приложение для Android. Но вам нужно как-то сжать ваши данные и вызвать звонок REST в нужном месте. Там я бы предложил использовать службу android Service или AsyncTask или загрузчик или rx.java, которые будут запрашивать ваши данные в фоновом streamе, чтобы не блокировать ваш пользовательский интерфейс.

Итак, теперь вы можете найти наиболее подходящее место для звонка

 SomeUserModel yourUser = yourUsersApi.fetchUser("someUsers") 

для получения удаленных данных.

Я только что использовал модификацию в течение нескольких недель, и сначала мне было трудно использовать ее в своем приложении. Я хотел бы поделиться с вами самым простым способом использования модификации в вашем приложении. И затем, если вы уже хорошо разбираетесь в модернизации, вы можете улучшить свои коды (отделяя ui от api и использовать обратные вызовы) и, возможно, получить некоторые методы из поста выше.

В вашем приложении у вас есть Login, Activity для списка задач и активности для просмотра подробной задачи.

Во-первых, вам нужно добавить модификацию в приложение и сделать два способа, следуйте за сообщением @artemis выше.

Retrofit использует интерфейс как ваш API. Итак, создайте class интерфейса.

 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 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> 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 callback); //this is an example of response POJO - make sure your variable name is the same with your json tagging } 

Создайте еще один class интерфейса, чтобы удержать все ваши BASE ADDRESS вашего api

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

В вашей активности входа создайте метод обработки модифицированного

 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() { @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 } }); } 

В своем 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>() { @Override public void success(ArrayList 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 } }); } 

В вашем подробном списке

 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() { @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 } }); } 

Надеюсь, это поможет вам, хотя это действительно самый простой способ использовать модификацию.

Взгляните на этот отличный блог об использовании Retrofit вместе с Otto, обе библиотеки находятся на Square.

http://www.mdswanson.com/blog/2014/04/07/durable-android-rest-clients.html

Основная идея заключается в том, что вы будете ссылаться на объект «repository» в своем classе Application. Этот объект будет иметь методы, которые «подписываются» на rest для запросов api-событий. Когда один из них будет получен, он сделает правильный повторный выбор, а затем «отправит» ответ, который затем может быть «подписан» другим компонентом (например, деятельностью, которая сделала запрос).

Как только вы все правильно настроите, доступ к данным через ваш api для вашего restа станет очень простым. Например, создание запроса данных будет выглядеть примерно так:

  mBus.post(new GetMicropostsRequest(mUserId)); 

и потребление данных будет выглядеть примерно так:

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

Это требует немного усилий, но в конце концов становится «тривиальным» доступ ко всему, что вам нужно, от нашего бэкэнд через Rest.

Вы можете попытаться сохранить ссылки на свой api внутри своего classа приложения. Затем вы можете получить экземпляр из любой активности или fragmentа и получить api оттуда. Это звучит немного странно, но это может быть простая альтернатива DI. И если вы будете хранить ссылки только в своем classе приложения, это не будет своего рода божественным объектом

UPD: http://square.github.io/retrofit/ – вот некоторая документация, это может быть полезно

Использование RetroFit очень просто.

  • Добавьте dependecy в build.gradle.

      compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'com.squareup.okhttp:okhttp:2.4.0' 
  • Создайте интерфейс для всех методов http.

  • Скопируйте свой вывод json и создайте class pojo, чтобы получить json вашего
    ответ, вы можете сделать pojo с сайта JsonSchema2pojo .

  • сделайте адаптер и вызовите свой метод

    для полной демонстрации попробуйте этот урок. Обновите Android-пример.

Проверьте это приложение, которое демонстрирует интеграцию с Retrofit в API задач Google.

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

Существуют примеры Retrofit api (TaskApi), используемые в Activity AsyncTask в MainActivity, а также примеры использования в Sync Adapter в фоновом режиме.

Страtagsя из статьи, опубликованной в ответе @ nPn, вероятно, является более элегантным решением, но вы можете хотя бы взглянуть на другой рабочий пример.

Во-первых, помещение всего в MainActivity было бы плохой практикой, и вы попали бы в объект Бога .

Документация на сайте « Дооснащение» фантастична, поэтому я собираюсь прочитать ваш вопрос о том, как структурировать проект. Я написал очень маленькое приложение для демонстрационных целей. Он загружает кошек из API кошки и должен быть довольно простым, чтобы следить за тем, что происходит.

В нем есть пример использования JSON или XML для анализа данных из службы. Вы можете найти его на странице https://github.com/codepath/android_guides/wiki/Consuming-APIs-with-Retrofit

Надеюсь, вы сможете экстраполировать, почему я структурировал его так, как я. Я рад ответить на любые ваши вопросы в комментариях и обновить ответ.

Я нахожу эти обучающие программы AndroidHive , CodePath полезен

Я кратко опишу, что я узнал.

Шаг 1: добавьте эти три dependencies to build.gradle и Add Internet permission для Manifest

 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 

Добавьте их в манифест

  

Шаг 2 Creae ApiClient и 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; } } 

где ApiInterface.class

 public interface ApiInterface { // getting same data in three different ways. @GET("GetCompanyDetailByID") Call getDetailOfComapanies(@Query("CompanyID") int companyID); @GET("GetCompanyDetailByID") Call getRawDetailOfCompanies(@Query("CompanyID") int companyID); @GET("{pathToAdd}") Call getDetailOfComapaniesWithPath(@Path("pathToAdd") String pathToAppend, @Query("CompanyID") int companyID); } 

И назовите эту услугу, как

 ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); Call companyResponseCall = apiService.getDetailOfComapanies(2); //Call companyResponseCall = apiService.getDetailOfComapaniesWithPath("GetCompanyDetailByID",2); companyResponseCall.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { CompanyResponse comapnyResponse = response.body(); Boolean status = comapnyResponse.getStatus(); } @Override public void onFailure(Call call, Throwable t) { } }); 

Для получения Raw Json String

 Call call = apiService.getRawDetailOfCompanies(2); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response 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(){}.getType(); Data yourClassList = new Gson().fromJson(jObject.toString(), listType); yourClassList.getCompanyDetail(); } e.printStackTrace(); } } @Override public void onFailure(Call call, Throwable t) { } }); 

Вы можете создать свой бизнес-объект, используя http://www.jsonschema2pojo.org/ , просто вставив json. и выбор типа источника для JSON и стиля annotations для GSon

Нашел небольшой, но полный и краткий пример на https://github.com/square/retrofit/tree/master/samples

Начинающим находят это немного пугающим, чтобы учиться модернизации. Я подготовил учебник, который упростит кривую обучения. Дополнительную информацию см. В разделе « Обновление до Android» .

Сначала добавьте эти строки в файл gradleиента

 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' 

Затем создайте объекты в 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(); 

Создать iterface

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

Создание classов

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

Добавьте этот метод в свою деятельность

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

Работает

введите описание изображения здесь пакет 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> getInbox(); } 

compile ‘com.google.code.gson: gson: 2.6.2’

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

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

Переадресация вызова 2 APi внутри onCreate

 private void getInbox() { swipeRefreshLayout.setRefreshing(true); ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); Call> call = apiService.getInbox(); call.enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> 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> call, Throwable t) { Toast.makeText(getApplicationContext(), "Unable to fetch json: " + t.getMessage(), Toast.LENGTH_LONG).show(); swipeRefreshLayout.setRefreshing(false); } }); } 

Исходный код https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0JabUU

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

Разработка собственной безопасной HTTP-библиотеки для интерфейса с REST API может быть настоящей болью: вы должны обрабатывать многие аспекты, такие как создание соединений, кэширование, повторная попытка неудачных запросов, streamовая обработка, анализ ответов, обработка ошибок и многое другое. С другой стороны, дооснащение – это хорошо спланированная, документированная и проверенная библиотека, которая сэкономит вам много драгоценного времени и головных болей.

compile ‘com.google.code.gson: gson: 2.6.2’

compile ‘com.squareup.retrofit2: retrofit: 2.1.0’ // обязательный

compile ‘com.squareup.retrofit2: converter-gson: 2.1.0’ // для модифицированного преобразования

Я просто затормозил эту проблему очень просто, вам просто нужно установить плагин и выполнить некоторые шаги для внедрения модификации в любом из приложений.

Уже опубликован ответ: Модернизация в андроиде?

Добавить (QAssist – Android Studio Plugin) Android-плагин в вашей студии Android. ( https://github.com/sakkeerhussain/QAssist ).

Надеюсь, что это поможет вам.

Простая модернизация + okhttp с использованием 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); } 
  • Неподдерживаемая версия major.minor 49.0
  • Вызов super ()
  • Сохранять широковещательный приемник после закрытия приложения
  • Android-импорт java.nio.file.Files; не может быть решен
  • PorterduffXfermode: очистить раздел растрового изображения
  • Android - динамически получать текущую активность на переднем плане
  • Невозможно скомпилировать проект, когда я использую Lombok под IntelliJ IDEA
  • Преобразование строки json в java-объект?
  • Как настроить чувствительность микрофона во время записи звука в Android
  • SQlite Получение ближайших мест (с широтой и долготой)
  • Https Connection Android
  • Interesting Posts

    Что означает эта ошибка WCF: «Предупреждение о настраиваемом инструменте: невозможно импортировать wsdl: portType»

    Как добавить изображение в тело электронной почты

    Получить возвращаемое значение из хранимой процедуры

    Можно ли перезагрузить песни, которые вы заплатили за iTunes?

    curl: (1) Протокол https не поддерживается или отключен в libcurl

    Поиск строки в текстовом столбце в MySQL

    Выяснение, какое приложение использует веб-камеру

    C #: Как получить полный путь выполнения процесса?

    Как вы можете проверить, сколько питания USB-порт может доставить?

    Неправильно ли использовать break для выхода из цикла в Java?

    Динамические данные, связывающие данные

    Как наиболее элегантно перебирать параллельные коллекции?

    Как удалить всплывающие окна adtyty.google.com с ** ПК **? (Перенаправление Tradeadexchange.)

    Последняя итерация расширенного цикла в java

    Каковы различия между абстрактными classами и интерфейсами в Java 8?

    Давайте будем гением компьютера.