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

时间:2015-12-21 20:24:46

标签: asynchronous 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();
        }
    });
}

我找到了一种同步方式,但不是异步方式。

1 个答案:

答案 0 :(得分:0)

根据您的问题和评论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);
}

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