具有异步调用改造的多个查询参数

Multiple Query Params with Asyncronous Call Retrofit

更新:

我了解到我想要做的是在 Retrofit 中也使用 Async 进行多个查询。我已经更新了我的代码,但我无法获得与查询的异步。

我正在使用 Retrofit 对电影数据库进行数据调用,需要根据用户设置更改排序顺序。我不清楚如何将此功能添加到我的界面。

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

我找到了一种同步但不异步的方法。

根据你的问题和评论,IHMO,你应该 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);
}

所以,请再次检查您的代码