2016-12-15 1 views
0

Я хочу использовать Retrofit 2.1.0 для своего следующего Android-проекта. Я хотел бы использовать шаблон дизайна и, следовательно, создавать отдельные классы для каждого вызова REST т.е.Как обновить пользовательский интерфейс Activity/Fragment от Retrofit onResponse()?

IBalanceService.java

public Interface IBalanceService{ 
    @GET("users/{username}") 
    void getUser(@Path("username") String username, Callback<User> cb); 
} 

BalanceRestClient.java

public class BalanceRestClient{ 

    String username = "Makarov"; 

    Retrofit retrofit = new Retrofit.Builder() 
           .baseUrl("http://hovermind.com") 
           .addConverterFactory(GsonConverterFactory.create()) 
           .addCallAdapterFactory(rxAdapter) 
           .build(); 

    IBalanceService bs = retrofit.create(IBalanceService.class); 


    Call<User> call = apiService.getUser(username); 
    call.enqueue(new Callback<User>() { 

     @Override 
     public void onResponse(Call<User> call, Response<User> response) { 

      User user = response.body(); 

      // update Activity/Fragment from here 

     } 

     @Override 
     public void onFailure(Call<User> call, Throwable t) { 
     // Log error here since request failed 
     } 

    }); 
} 

BalanceActivity.java

public BalanceActivity extends Activity{ 

    // BalanceRestClient will update some UI elements 
} 

Как обновить пользовательский интерфейс в моей активности/фрагменте из onResponse()?

Дополнительная информация:
мин SDK: 19
целевой SDK: 23
дооснащения 2.1.0 с OkHttp и gson

+0

Существует а [вопрос здесь] (http://stackoverflow.com/q/34184088/4802664), но только один ответ, и это не решило мою проблему. –

+0

проверить http://stackoverflow.com/a/40957059/4247543 –

ответ

1
public class BalanceRestClient { 

      private static BalanceRestClient instance; 
      private IBalanceService request; 

      private BalanceRestClient() { 
       Retrofit retrofit = new Retrofit.Builder() 
         .baseUrl("http://hovermind.com") 
         .addConverterFactory(GsonConverterFactory.create()) 
         .addCallAdapterFactory(rxAdapter) 
         .build(); 

       request = retrofit.create(IBalanceService.class); 
      } 

      public static synchronized BalanceRestClient getInstance() { 
       if (instance == null) 
        instance = new BalanceRestClient(); 

       return instance; 
      } 

      public void getRequest(String userName, YourCustomeCallback callback) { 

       Call<User> call = apiService.getUser(username); 
       call.enqueue(new Callback<User>() { 

        @Override 
        public void onResponse(Call<User> call, Response<User> response) { 

         User user = response.body(); 

         callback.onResponse(user); 

        } 

        @Override 
        public void onFailure(Call<User> call, Throwable t) { 
         // Log error here since request failed 
        } 

       }); 
      } 
     } 
  1. Создать класс одноплодной. Его init запрос только один раз.
  2. Создайте собственный обратный вызов, который вернет вам ответ на пользовательский интерфейс.
  3. Вызовите BalanceRestClient.getInstance.getRequest (params ..), где вы хотите его использовать.
+0

Nice. но я смущен о синглетоне. что, если я использую BalanceRestClient несколько раз в разных действиях. В чем проблема с созданием нескольких экземпляров BalanceRestClient вместо singleton? –

+0

Это неэкономично. Почему вы хотите создать снова, и снова, если вы это уже сделали? –

+0

Я также видел много примеров, когда retrofit (RestAdapter) является singleton, почему? Я задал вопрос об однопользовательском restrofit (RestAdapter). 1. Почему модифицирование является одноэлементным, в чем преимущество создания одномоментного симулятора, что если я создам несколько экземпляров модификации в одном действии. но, к сожалению, мой вопрос был отмечен как неясный и удаленный. после этого я не мог задать вопрос в течение нескольких дней –

0

сделать интерфейс, как это на:

public interface BalanceListener { 

    void onUserAvailable(User user); 

} 

В вашем BalanceRestClient есть экземпляр. И в onResponse:

@Override 
    public void onResponse(Call<User> call, Response<User> response) { 

     User user = response.body(); 

     listener.onUserAvailable(user); 

    } 

Сделайте свою активность реализации BalanceListner:

public class BalanceActivity extends Activity implements BalanceListener { 
       ...... 

     @Override 
     public void onUserAvailable(User user) { 
      // update user views here 
     } 
    } 
+0

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

+0

@ HassanMakarov Я считаю, что нет лучшей вещи для дизайна. Вы можете использовать шаблоны MVP/MVC и записывать неаккуратный и медленный код. С другой стороны, вы не можете использовать шаблоны и иметь отличную производительность. Производительность зависит от 100000 вещей. Но если вы хотите, чтобы ваш код был чистым, хорошо структурированным, легко масштабируемым и найти ошибки относительно легко, используйте некоторые из шаблонов, упомянутых выше. Я предпочитаю MVP. Вы можете комбинировать их с шаблонами Singleton/Factory/Builder и т. Д. (Которые зависят от ваших текущих потребностей). –