我需要处理调用的返回,但是它可以返回布尔值或对象。找到电话号码后,它立即崩溃为onFailure。
我正在寻找解决方案,但发现所有问题都无法解决我的问题。
我的界面:
public interface PessoaService {
@FormUrlEncoded
@POST("Pessoa/BuscaContatosAgenda/")
Call<Boolean> buscaContatoAgenda(@Field("Identificador") String identificador,
@Field("UnidadeId") String unidadeId,
@Field("Telefones") ArrayList<String> telefone);
}
我的RetrofitConfig
public class RetrofitConfig {
private final Retrofit retrofit;
public RetrofitConfig() {
this.retrofit = new Retrofit.Builder()
.baseUrl(DadosEmpresa.URL)
//O método addConverterFactory recebe a classe que será responsável por lidar com a conversão
.addConverterFactory(JacksonConverterFactory.create())
//Utilizamos o método build para criar o objeto Retrofit
.build();
}
public PessoaService getBuscaContatoAgenda() {
return this.retrofit.create(PessoaService.class);
}
}
我的活动功能:
private void verificandoContatos() {
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, ContactsContract.Contacts.DISPLAY_NAME);
telefonesArrayList = new ArrayList<>();
while (cursor.moveToNext()) {
String telefone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
telefonesArrayList.add(telefone);
}
cursor.close();
Call<Boolean> call = new RetrofitConfig().getBuscaContatoAgenda().buscaContatoAgenda(pessoa.getIdentificador(), DadosEmpresa.UnidadeID, telefonesArrayList);
call.enqueue(new Callback<Boolean>() {
@Override
public void onResponse(Call<Boolean> call, Response<Boolean> response) {
if (response.body() == true) {
Toast.makeText(AgendaContatoActivity.this, "Nenhum contato foi encontrado na sua agenda!", Toast.LENGTH_LONG).show();
} else if (response.body() == false) {
Toast.makeText(AgendaContatoActivity.this, "Ocorreu um erro inesperado. Tente novamente mais tarde.", Toast.LENGTH_LONG).show();
Log.e(TAG, "onResponse: " + response.body().toString());
} else {
Toast.makeText(AgendaContatoActivity.this, "Esses são seus contatos encontrados", Toast.LENGTH_LONG).show();
createRecyclerView();
}
}
@Override
public void onFailure(Call<Boolean> call, Throwable t) {
Log.e(TAG, "onFailure: Erro ao enviar contatos: " + t.getMessage());
Toast.makeText(getBaseContext(), "Ocorreu um erro inesperado. Tente novamente.", Toast.LENGTH_LONG).show();
}
});
}
t.getMessage = com.fasterxml.jackson.databind.JsonMappingException: 无法从START_ARRAY中反序列化java.lang.Boolean的实例 令牌,位于[来源:okhttp3.ResponseBody$BomAwareReader@f41ca80;线: 1,列:1]
编辑/更新/解决方案
寻求帮助后,我找到了解决问题的方法。不是最好的方法,但是可以解决此问题:
private void verificandoContatos() {
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, ContactsContract.Contacts.DISPLAY_NAME);
telefonesArrayList = new ArrayList<>();
while (cursor.moveToNext()) {
String telefone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
telefonesArrayList.add(telefone);
}
cursor.close();
Call<ArrayList<GetContatoAgenda>> call = new RetrofitConfig().getBuscaContatoAgenda().buscaContatoAgenda(pessoa.getIdentificador(), DadosEmpresa.UnidadeID, telefonesArrayList);
call.enqueue(new Callback<ArrayList<GetContatoAgenda>>() {
@Override
public void onResponse(Call<ArrayList<GetContatoAgenda>> call, Response<ArrayList<GetContatoAgenda>> response) {
Toast.makeText(AgendaContatoActivity.this, "Esses são seus contatos encontrados em nossa aplicativo!", Toast.LENGTH_LONG).show();
contatoArrayList = new ArrayList<GetContatoAgenda>();
//Como a Callback do Retrofit já faz o mapeamento, então fazemos o contatoArrayList receber a response.body();
contatoArrayList = response.body();
createRecyclerView();
}
@Override
public void onFailure(Call<ArrayList<GetContatoAgenda>> call, Throwable t) {
Log.e(TAG, "onFailure: Erro ao enviar contatos: " + t.getMessage());
Toast.makeText(getBaseContext(), "Ocorreu um erro inesperado. Tente novamente.", Toast.LENGTH_LONG).show();
}
});
}
答案 0 :(得分:0)
问题出在您的模型中。您需要确保获得的JSON响应100%适合用于反序列化的模型 这条线是个问题。这里假设是您在评论中显示的模型
Call<Boolean> call
当您收到JSON响应时,您想从中解析数据。那是个好话题,怎么做 Android parse JSONObject