2015-12-21 3 views
0

UPDATE:Multiple Параметры запроса с асинхронными вызовами Модернизированного

Я узнал, что я ищу, чтобы сделать, это использовать Async в Модернизированном с множественными запросами тоже. Я обновил свой код, но я не могу получить асинхронный запрос.

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

sort_by = highest_rating.desc

или

sort_by = popularity.desc

Интерфейс:

public interface MovieDatabaseApiCient { 
@GET("/3/discover/movie") 
void getData(@Query("api_key") String apiKey, @Query("sort_by") String sortByValue, Callback<MovieDbModel> response); 

}

ОБНОВЛЕНО API-ИНТЕРФЕЙС:

public interface MovieDatabaseApiCient { 
@GET("/3/discover/movie?sort_by=popularity.desc&api_key=xxxxxxx") 
    void getMoviesByPopularityDesc(Callback<MovieDbModel> response); 

@GET("/3/discover/movie?sort_by=vote_average_desc&api_key=xxxxxxxx") 
void getMoviesByVotingDesc(Callback<MovieDbModel> response); 

}

ОБНОВЛЕНО ВЫЗОВ ДАННЫХ ДЛЯ РАБОТЫ:

private void makeDataCall(String sortPreference) { 
    final RestAdapter restadapter = new RestAdapter.Builder().setEndpoint(ENDPOINT_URL).build(); 

    MovieDatabaseApiCient apiLocation = restadapter.create(MovieDatabaseApiCient.class); 

    if (sortPreference.equals(this.getString(R.string.sort_order_popularity))){ 
     apiLocation.getMoviesByPopularityDesc (new Callback<MovieDbModel>() { 

      @Override 
      public void success(MovieDbModel movieModels, Response response) { 
       movieDbResultsList = movieModels.getResults(); 
       MoviesGridViewAdapter adapter = new MoviesGridViewAdapter(getApplicationContext(), R.layout.movie_gridview_item, movieDbResultsList); 
       gridView.setAdapter(adapter); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Log.d("ERROR", error.toString()); 
       Toast.makeText(getApplicationContext(), "Error: " + error.toString(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 

    } else { 
     apiLocation.getMoviesByVotingDesc( new Callback<MovieDbModel>() { 

      @Override 
      public void success(MovieDbModel movieModels, Response response) { 
       movieDbResultsList = movieModels.getResults(); 
       MoviesGridViewAdapter adapter = new MoviesGridViewAdapter(getApplicationContext(), R.layout.movie_gridview_item, movieDbResultsList); 
       gridView.setAdapter(adapter); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Log.d("ERROR", error.toString()); 
       Toast.makeText(getApplicationContext(), "Error: " + error.toString(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 

    } 

} 

Мой призыв к данным:

private void makeDataCall (String apiKey, String sortPreference) { 
    final RestAdapter restadapter = new RestAdapter.Builder().setEndpoint(ENDPOINT_URL).build(); 

    MovieDatabaseApiCient apiLocation = restadapter.create(MovieDatabaseApiCient.class); 

    apiLocation.getData(apiKey, sortPreference, new Callback<MovieDbModel>){ 

     @Override 
     public void success(MovieDbModel movieModels, Response response) { 
      movieDbResultsList = movieModels.getResults(); 
      MoviesGridViewAdapter adapter = new MoviesGridViewAdapter(getApplicationContext(), R.layout.movie_gridview_item, movieDbResultsList); 
      gridView.setAdapter(adapter); 
     } 

     @Override 
     public void failure(RetrofitError error) { 
      Log.d("ERROR", error.toString()); 
      Toast.makeText(getApplicationContext(), "Error: " + error.toString(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

Я нашел способ сделать Синхронно, но не асинхронно.

+0

Ваш код уже асинхронный – BNK

+0

Я понимаю, что это Async, но он не компилируется. Я получаю ошибку кода, начиная с блоков onsuccess и отказов. Он не знает параметр moviemodels. – taraloca

ответ

0

Ваш вопрос и комментарий, ИХМО, вы должны import retrofit.Callback; вместо import com.squareup.okhttp.Callback;

Мой код в следующем уже без ошибок компиляции:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // creating a RestAdapter using the custom client 
     RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(API_URL_BASE) 
       .setLogLevel(RestAdapter.LogLevel.FULL) 
       .setClient(new OkClient(mOkHttpClient)) 
       .build(); 

     WebService webService = restAdapter.create(WebService.class); 

     retrofit.Callback<GetRoleData> callback = new Callback<GetRoleData>() { 
      @Override 
      public void success(GetRoleData getRoleData, retrofit.client.Response response) { 

      } 

      @Override 
      public void failure(RetrofitError error) { 

      } 
     }; 

     webService.getData("api_key", "sort_by", callback); 
    } 

Интерфейс:

public interface WebService { 
    @GET("/3/discover/movie") 
    void getData(@Query("api_key") String apiKey, @Query("sort_by") String sortByValue, Callback<GetRoleData> response); 
} 

Итак, проверьте код еще раз

+0

Я импортирую retrofit.Callback. Я должен был упомянуть, что я использую Retrofit 1.9, и кажется, что вы используете 2.0. У меня нет класса OkHttpClient. Мое текущее решение не идеально (я не думаю) с повторением кода, необходимого для вызова двух отдельных методов в моей api. Я попробую свой путь с 2.0, потому что мне нравится меньший код. Благодаря! – taraloca

+0

Я пробовал с 2.0 beta, а затем не могу использовать RestAdapter. Когда я использую 1.9, я не могу использовать OkHttpClient. Я не уверен, что вы используете, но я не могу заставить ваше решение работать. Что я не замечаю? Спасибо за все Ваши ответы! – taraloca

+0

В моем коде также используется модификация 1.9 (вы можете видеть, что я использую RestAdapter). О OkHttpClient вы можете выполнить okhttp lib внутри файла build.gradle. – BNK

Смежные вопросы