您好我是Retrfoit 2的新手。我想使用Retrofit获取数据2.My API以JSON格式检索数据。我通过应用程序向API发送参数。当我在浏览器中测试它时API工作正常。我正在使用空对象引用,但我检查了所有内容。
这就是我的尝试。
模型类
public class Detail {
@SerializedName("PromoId")
@Expose
private String PromoId;
@SerializedName("PromoName")
@Expose
private String PromoName;
@SerializedName("Category")
@Expose
private String Category;
@SerializedName("PromoImg")
@Expose
private String PromoImg;
@SerializedName("compName")
@Expose
private String compName;
public String getCompName() {
return compName;
}
public void setCompName(String compName) {
this.compName = compName;
}
public String getPromoId() {
return PromoId;
}
public void setPromoId(String promoId) {
PromoId = promoId;
}
public String getPromoName() {
return PromoName;
}
public void setPromoName(String promoName) {
PromoName = promoName;
}
public String getCategory() {
return Category;
}
public void setCategory(String category) {
Category = category;
}
public String getPromoImg() {
return PromoImg;
}
public void setPromoImg(String promoImg) {
PromoImg = promoImg;
}}
Api客户端
public class ApiClient {
public static final String BASE_URL = "http://example.com";
public static Retrofit retrofit = null;
public static Retrofit getApiClient (){
if(retrofit==null){
retrofit = new Retrofit.Builder().baseUrl(BASE_URL).
addConverterFactory(GsonConverterFactory.create()).build();
}
return retrofit;
}}
Api界面
public interface ApiInterface {
@POST("/api/customer/{PromoId}")
Call<Detail> getReponse(@Path("PromoId") String PromoId) ;
}
主要活动
public class MainActivity extends Activity {
private ApiInterface apiInterface;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.textView);
getDataForId("3");
}
public void getDataForId(final String id){
apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
Call<Detail> call = apiInterface.getReponse(id);
call.enqueue(new Callback<Detail>() {
@Override
public void onResponse(Call<Detail> call, Response<Detail> response) {
final Detail myResponse = response.body();
Toast.makeText(getApplicationContext(), "Inside on Response", Toast.LENGTH_SHORT).show();
runOnUiThread(new Runnable() {
@Override
public void run() {
tv=(TextView)findViewById(R.id.textView);
tv.setText(myResponse.getCategory());
}
});
}
@Override
public void onFailure(Call<Detail> call, Throwable t) {
Toast.makeText(getApplicationContext(), "Failed", Toast.LENGTH_SHORT).show();
}
});}}
答案 0 :(得分:0)
由于@Raghunandan提到runOnUiThread
没有必要,你已经异步拨打了电话。
但通常你在这里得到null有两个原因:
从API检索JSON的问题(您已确认API返回正确的JSON)
解析JSON的问题(更有可能)
如果您使用的是Android Studio 3,则可以在Android Studio Profiler的“网络”视图中对其进行调试,以查看您的应用是否正在检索JSON对象,如下所述: https://futurestud.io/tutorials/retrofit-2-analyze-network-traffic-with-android-studio-profiler
如果你没有使用Android Studio 3,你可能想使用OkHttp拦截器(这将在你的日志中显示JSON): https://www.learn2crack.com/2016/06/retrofit-okhttp-logging-interceptor.html 请务必在发布应用之前将其删除。
如果您在日志中没有看到JSON,那么您的问题是(1)如上所述
根据您的真实BASE_URL,您可能希望查看/
中@POST("/api/customer/{PromoId}")
的位置,不确定这是否是问题,但是/
的位置非常特别的改造如下所述:
https://futurestud.io/tutorials/retrofit-2-url-handling-resolution-and-parsing
如果您可以在日志中看到JSON,那么问题是(2),通常在这种情况下的问题是:
GsonConverterFactory
中,请确保您在build.gradle中导入兼容版本