【问题标题】:Retrofit 2 Spinner failed to get dataRetrofit 2 Spinner 无法获取数据
【发布时间】:2018-09-17 19:37:09
【问题描述】:

我想使用retrofit 2 制作一个微调器,这是我的微调器类:

private void initSpinnerMeridian(){
        loading = ProgressDialog.show(mContext, null, "Loading...", true, false);

    mApiInterface.getMeridian().enqueue(new Callback<DataModel>() {
        @Override
        public void onResponse(Call<DataModel> call, Response<DataModel> response) {
            if (response.isSuccessful()) {
                loading.dismiss();
                List<Meridian> dataMeridian = response.body().getMeridian();
                List<String> listSpinner = new ArrayList<String>();
                for (int i = 0; i < dataMeridian.size(); i++){
                    listSpinner.add(dataMeridian.get(i).getNama());
                }

                ArrayAdapter<String> adapter = new ArrayAdapter<String>(mContext,
                        android.R.layout.simple_spinner_item, listSpinner);
                adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                spMeridian.setAdapter(adapter);
            } else {
                loading.dismiss();
                Toast.makeText(mContext, "Failed get data from api", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<DataModel > call, Throwable t) {
            t.printStackTrace();
            loading.dismiss();
            Toast.makeText(mContext, "Check your internet connection", Toast.LENGTH_SHORT).show();
        }
    });
}

这是我的ApiInterface 课程:

public interface ApiInterface {
@GET("/api/data/meridian")
Call<DataModel> getMeridian();

@GET("/data/proyek")
Call<DataModel> getProyek();

@FormUrlEncoded
@POST("/transaksi")
Call<InputModel> postTransaksi(
        @Field("save") String save,
        @Field("id_meridian") String idMeridian,
        @Field("id_proyek") String idProyek,
        @Field("kegiatan") String kegiatan,
        @Field("nominal") String nominal,
        @Field("id_kategori") String idKategori,
        @Field("tanggal") String tanggal,
        @Field("keterangan") String keterangan,
        @Field("status") Object status,
        @Field("images") ImageView images
);

}

但是,当我在模拟器上运行它时,什么都没有发生,只有一个带有文本的祝酒词:Failed get data from api 确实出现了。我该怎么办?

【问题讨论】:

    标签: android spinner retrofit2


    【解决方案1】:

    您需要解析来自 API 的不成功错误响应。 api 可能会返回一个原因(即未经授权、路由不存在等)。

    我建议从这里阅读并实施一些东西https://futurestud.io/tutorials/retrofit-2-simple-error-handling

    这篇文章也可能有帮助:https://stackoverflow.com/a/38243723/6407116

    试试下面看看日志

    ...
    } else {
        loading.dismiss();
        Toast.makeText(mContext, "Failed get data from api", Toast.LENGTH_SHORT).show();
        Log.d("Error " + response.errorBody().string());
    }
    

    补充说明:

    我不确定您的 okhttpclient 是如何构建的,但您可以添加如下所示的 HttpLoggingInterceptor 以更好地了解您的请求所发生的一切。

    OkHttpClient providesOkHttpClient() {
        OkHttpClient.Builder builder = new OkHttpClient().newBuilder()
                .readTimeout(30, TimeUnit.SECONDS)
                .connectTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(30, TimeUnit.SECONDS);
    
        if (BuildConfig.DEBUG) {
            // Add a logging interceptor for debug builds only
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addInterceptor(loggingInterceptor);
        }
        return builder.build();
    }
    

    【讨论】:

    • 谢谢!现在,当我在模拟器上运行它时,会出现带有 text: value html of type java.lang.string cannot be convert to jsonobject 的 toast。我该如何解决这个问题?
    • 对不起我的英语不好
    • 添加了一个代码 sn-p 来回答。试试看并查看日志
    • 我收到错误“未处理的异常 java.io.ioexception”
    • 我在我的答案中添加了一些额外的注释,用于向您的 okhttp 构建器添加日志拦截器。您的控制台中将有额外的日志,因此您应该能够看到从您的网络请求中发送和接收的内容。可能比尝试传递未知响应更容易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2019-03-20
    • 2017-06-12
    • 1970-01-01
    • 2018-03-19
    • 2018-08-27
    相关资源
    最近更新 更多