排队onResponse方法在android改造中返回空的response.body()

时间:2018-12-17 13:38:06

标签: android retrofit retrofit2

当我调用自己的API之一时,onRespone方法将返回一个空的response.body()。我之前多次遵循这种方法,但仍然有效,但是在这种情况下不起作用。这个api也可以在浏览器中使用。

我检查了所有事情:SerializedName标签,实现了我正在使用的Serializable,api方法中的所有类,...。我也尝试使用同步调用,但是它不起作用。

注意我如何从回调中获取response.body()值:我将变量声明为活动类字段,并为其分配response.body()。

我真的很困惑。有什么想法吗?

这些都是您需要的所有代码:

活动:

package com.example.amirmasoud.mgtools_2.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import com.example.amirmasoud.mgtools_2.GetDataService;
import com.example.amirmasoud.mgtools_2.R;
import com.example.amirmasoud.mgtools_2.RetrofitInstance;
import com.example.amirmasoud.mgtools_2.model.ToolsItem;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class ToolContentActivity extends AppCompatActivity {

    private GetDataService service = RetrofitInstance.getRetrofitInstance().create(GetDataService.class);
    private ToolsItem toolItem = new ToolsItem();
    private int toolsItemId = 0;

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

        Bundle bundle = new Bundle(getIntent().getExtras());
        toolsItemId = bundle.getInt("toolItemId");

        service.getToolItemContent(toolsItemId).enqueue(new Callback<ToolsItem>() {
            @Override
            public void onResponse(Call<ToolsItem> call, Response<ToolsItem> response) {
                toolItem.mConstructor(response.body());
            }

            @Override
            public void onFailure(Call<ToolsItem> call, Throwable t) {
                Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
            }
        });
    }
}

型号:

package com.example.amirmasoud.mgtools_2.model;

import com.google.gson.annotations.SerializedName;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by AmirMasoud on 12/9/2018.
 */

public class ToolsItem implements Serializable {

    @SerializedName("MainTypeID")
    private int mainTypeID = 0;

    @SerializedName("Name")
    private String persianName = "";

    @SerializedName("ImageURL")
    private String imageURL = "";

    @SerializedName("EnglishName")
    private String englishName = "";

    @SerializedName("OtherName")
    private String otherName = "";

    @SerializedName("CountryID")
    private int countryID = 0;

    @SerializedName("Year")
    private int year = 0;

    @SerializedName("ComplexityName")
    private String complexityName = "";

    @SerializedName("RelatedMainTypeID")
    private List<Integer> relatedMainTypeID = new ArrayList<>();

    @SerializedName("IntroductionDescription")
    private String introductionDescription = "";

    @SerializedName("Pros")
    private String pros = "";

    @SerializedName("Cons")
    private String cons = "";

    @SerializedName("RequiredTime")
    private int requiredTime = 0;

    @SerializedName("RequiredEmployee")
    private int requiredEmployee = 0;

    @SerializedName("RequiredBudget")
    private int requiredBudget = 0;

    @SerializedName("RequiredKnowledge")
    private int requiredKnowledge = 0;

    @SerializedName("Applications")
    private String applications = "";

    @SerializedName("ComplementaryContent")
    private List<CompContentToolItem> complementaryContent = new ArrayList<>();

    public ToolsItem mConstructor(ToolsItem item) {
        this.mainTypeID = item.getMainTypeID();
        this.persianName = item.getPersianName();
        this.englishName= item.getEnglishName();
        this.imageURL = item.getImageURL();
        this.otherName = item.getOtherName();
        this.countryID = item.getCountryID();
        this.year = item.getYear();
        this.complexityName = item.getComplexityName();
        this.relatedMainTypeID = item.getRelatedMainTypeID();
        this.introductionDescription = item.getIntroductionDescription();
        this.pros = item.getPros();
        this.cons = item.getCons();
        this.requiredTime = item.getRequiredTime();
        this.requiredBudget = item.getRequiredBudget();
        this.requiredEmployee = item.getRequiredEmployee();
        this.requiredKnowledge = item.getRequiredKnowledge();
        this.applications = item.getApplications();
        this.complementaryContent = item.getComplementaryContent();
        return this;
    }

    public String getEnglishName() {
        return englishName;
    }

    public void setEnglishName(String englishName) {
        this.englishName = englishName;
    }

    public String getOtherName() {
        return otherName;
    }

    public void setOtherName(String otherName) {
        this.otherName = otherName;
    }

    public int getCountryID() {
        return countryID;
    }

    public void setCountryID(int countryID) {
        this.countryID = countryID;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getComplexityName() {
        return complexityName;
    }

    public void setComplexityName(String complexityName) {
        this.complexityName = complexityName;
    }

    public List<Integer> getRelatedMainTypeID() {
        return relatedMainTypeID;
    }

    public void setRelatedMainTypeID(List<Integer> relatedMainTypeID) {
        this.relatedMainTypeID = relatedMainTypeID;
    }

    public String getIntroductionDescription() {
        return introductionDescription;
    }

    public void setIntroductionDescription(String introductionDescription) {
        this.introductionDescription = introductionDescription;
    }

    public String getPros() {
        return pros;
    }

    public void setPros(String pros) {
        this.pros = pros;
    }

    public String getCons() {
        return cons;
    }

    public void setCons(String cons) {
        this.cons = cons;
    }

    public int getRequiredTime() {
        return requiredTime;
    }

    public void setRequiredTime(int requiredTime) {
        this.requiredTime = requiredTime;
    }

    public int getRequiredEmployee() {
        return requiredEmployee;
    }

    public void setRequiredEmployee(int requiredEmployee) {
        this.requiredEmployee = requiredEmployee;
    }

    public int getRequiredBudget() {
        return requiredBudget;
    }

    public void setRequiredBudget(int requiredBudget) {
        this.requiredBudget = requiredBudget;
    }

    public int getRequiredKnowledge() {
        return requiredKnowledge;
    }

    public void setRequiredKnowledge(int requiredKnowledge) {
        this.requiredKnowledge = requiredKnowledge;
    }

    public String getApplications() {
        return applications;
    }

    public void setApplications(String applications) {
        this.applications = applications;
    }

    public List<CompContentToolItem> getComplementaryContent() {
        return complementaryContent;
    }

    public void setComplementaryContent(List<CompContentToolItem> complementaryContent) {
        this.complementaryContent = complementaryContent;
    }

    public int getMainTypeID() {
        return mainTypeID;
    }

    public void setMainTypeID(int mainTypeID) {
        this.mainTypeID = mainTypeID;
    }

    public String getPersianName() {
        return persianName;
    }

    public void setPersianName(String persianName) {
        this.persianName = persianName;
    }

    public String getImageURL() {
        return imageURL;
    }

    public void setImageURL(String imageURL) {
        this.imageURL = imageURL;
    }
}

子模型:

package com.example.amirmasoud.mgtools_2.model;

import com.google.gson.annotations.SerializedName;

import java.io.Serializable;

/**
 * Created by AmirMasoud on 12/12/2018.
 */

public class CompContentToolItem implements Serializable {

    @SerializedName("FileURL")
    private String fileURL;

    @SerializedName("Description")
    private String description;

    public String getFileURL() {
        return fileURL;
    }

    public void setFileURL(String fileURL) {
        this.fileURL = fileURL;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

服务:

public interface GetDataService {

    @GET("GetMainTypeByID")
    Call<ToolsItem> getToolItemContent(@Query("MainTypeID") int toolItemId);

}

改造实例:

public class RetrofitInstance {
    private static final String BASE_URL = "https://assess.ir/service.svc/";
    private static Retrofit retrofit;

    public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {
            retrofit = new retrofit2.Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(UnsafeOkHttpClient.getUnsafeOkHttpClient())
                .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().setLenient().create()))
                .build();
        }
        return retrofit;
    }
}

1 个答案:

答案 0 :(得分:0)

首先,您必须使用GSON转换为json

 service.getToolItemContent(toolsItemId).enqueue(new Callback<ToolsItem>() {
        @Override
        public void onResponse(Call<ToolsItem> call, Response<ToolsItem> response) {
            Gson gson = new Gson();
            String data = gson.toJson(response.body)
            ToolsItem toolsItem = gson.fromJson(data,ToolsItem.class);
            toolItem.mConstructor(response.body());
        }

        @Override
        public void onFailure(Call<ToolsItem> call, Throwable t) {
            Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
        }
    });