就我而言,我使用了 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/