java - Retrofit 不会调用 onReponse 和 onFailure

标签 java android retrofit retrofit2

就我而言,我使用了 Retrofit 来与 REST API 联系。不幸的是,当我启动时,它永远不会达到 onResponse 和 onFailure 状态。我一行又一行地检查了调试,看起来他继续行:call.enqueue(new Callback<Api>() {随后它返回到开始循环,再次进入同一行并跳过两个语句,最终完成整个方法。当然问题是为什么?

public void ApiHit(String[] tags) {

    //retrofit
    TagApi tagApi = NetworkService.retrofit.create(TagApi.class);

    //recieve words from searchview, divide and put into string array
    for (int i=0; i < tags.length; i++){

        Call<Api> call = tagApi.getTasks(tags[i]);
        call.enqueue(new Callback<Api>() {

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


                //recieve possible tags for one word and put it into list
                for (int i = 0; i < response.body().getResults().size(); i++) {
                    listTags.add(new RowModel(response.body().getResults().get(i).getTag(), response.body().getResults().get(i).getAbsRelevance()));

                }

                //sort whole list
                Collections.sort(listTags);

                //add first tags to list
                for (int y = 0; y < 3; y++) {
                    listTagsFinal.add(new RowModel(listTags.get(y).getName(), listTags.get(y).getPosition()));
                }

                if (!isTagognizerTag) {
                    listTagsFinal.add(new RowModel("tagognizer", 23477853));
                    isTagognizerTag = true;
                }

                //add rest tags to list
                for (int y = 3; y < listTags.size(); y++) {
                    listTagsRest.add(new RowModel(listTags.get(y).getName(), listTags.get(y).getPosition()));
                }

            }

            @Override
            public void onFailure(Call<Api> call, Throwable t) {
            }

        });

    }
    //final sort
    Collections.sort(listTagsFinal);
    Collections.sort(listTagsRest);

    for (int y = 0; listTagsFinal.size() < 30; y++) {
        listTagsFinal.add(new RowModel(listTagsRest.get(y).getName(), listTagsRest.get(y).getPosition()));
    }

} 

我在 onCreate 的同一个类(mainactivity)中调用它 - 当用户接受在 searchView 中输入的文本时:

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


        ButterKnife.bind(this);
        listTags = new ArrayList<>();
        listTagsFinal = new ArrayList<>();
        listTagsRest = new ArrayList<>();

        //set Proxima Bold font on top textview
        Typeface typeface = Typeface.createFromAsset(getAssets(), "font/proximabold.ttf");
        tvTop.setTypeface(typeface);


        //search text handler
        svSearch.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                result = query.split(",?\\ ");
                for (int x = 0; x < result.length; x++) {
                    //  Log.d("ciacho", result[x] + "\n");

                }
                ApiHit(result);
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                //This is your adapter that will be filtered
                return false;
            }
        });


    }

这是我的简单模型类:

public class RowModel implements Comparable<RowModel>{

    private String name;
    private float position;

    public float getPosition() {
        return position;
    }

    public void setPosition(float position) {
        this.position = position;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public RowModel(String name, float position) {
        this.name = name;
        this.position = position;
    }

    @Override
    public int compareTo(RowModel rowModel) {
        float comparePosition = ((RowModel) rowModel).getPosition();


        return (int) (this.position- comparePosition);
    }

以及与其余部分通信的默认类:

public class Api {

    @SerializedName("geo")
    @Expose
    private List<Float> geo = null;
    @SerializedName("rank")
    @Expose
    private int rank;
    @SerializedName("results")
    @Expose
    private List<Result> results = null;
    @SerializedName("tag")
    @Expose
    private String tag;
    @SerializedName("tagExists")
    @Expose
    private boolean tagExists;

    public List<Float> getGeo() {
        return geo;
    }

    public void setGeo(List<Float> geo) {
        this.geo = geo;
    }

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public List<Result> getResults() {
        return results;
    }

    public void setResults(List<Result> results) {
        this.results = results;
    }

    public String getTag() {
        return tag;
    }

    public void setTag(String tag) {
        this.tag = tag;
    }

    public boolean isTagExists() {
        return tagExists;
    }

    public void setTagExists(boolean tagExists) {
        this.tagExists = tagExists;
    }

}

以及我的改造类的实现:

public class NetworkService {

    public static final Interceptor loggingInterceptor = new HttpLoggingInterceptor()
            .setLevel(HttpLoggingInterceptor.Level.BODY);

    public static final OkHttpClient httpClient = new OkHttpClient.Builder()
            .addInterceptor(loggingInterceptor)
            .build();

    public static final Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://api.xxx.com")
            .addConverterFactory(GsonConverterFactory.create())
            .client(httpClient)
            .build();

最后一个类:

public interface TagApi {


    @GET("/tag/{tagId}")
    Call<Api> getTasks(
            @Path("tagId") String tagId);


}

最佳答案

在Retrofit 2中,您应该在baseUrl末尾添加一个/:

public static final Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://api.xxx.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(httpClient)
            .build();

并且您不应在端点路径前面放置 /:

public interface TagApi {
    @GET("tag/{tagId}")
    Call<Api> getTasks(
            @Path("tagId") String tagId);

}

看一下示例 here .

关于java - Retrofit 不会调用 onReponse 和 onFailure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48892467/

相关文章:

java - 我不知道如何修复错误 NullPointerException

安卓系统日志文件

android - 如何对需要 Web 服务调用的 Android 应用程序进行单元测试

Android,无法使用 Retrofit 和 RxJava 2 构建应用程序

Java:将 Spring Autowired 库与 Guice 程序结合使用

java - Spring使用JDBC遇到空指针异常

java - JPA 中的并发(陈旧数据)问题

android - 退款客户应用内购买,但 BillingClient 仍然显示用户已购买?

Android Studio 不支持的 Gradle 插件版本

android - 注入(inject)改造android kotlin