改造2 - 将数据提取到textview不起作用

时间:2017-09-19 19:20:38

标签: android retrofit retrofit2

您好我是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();
        }


    });}}

1 个答案:

答案 0 :(得分:0)

由于@Raghunandan提到runOnUiThread没有必要,你已经异步拨打了电话。

但通常你在这里得到null有两个原因:

  1. 从API检索JSON的问题(您已确认API返回正确的JSON)

  2. 解析JSON的问题(更有可能)

  3. 如果您使用的是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),通常在这种情况下的问题是:

    • 格式错误的pojos
    • JSON转换器的版本不兼容,在您的情况GsonConverterFactory中,请确保您在build.gradle中导入兼容版本
    祝你好运