2016-02-19 3 views
0

В настоящее время я использую RetroFit и новичок в этом инструменте. Я запускаю проблему, указанную в названии, когда я запускаю свое приложение. Он не сбой, но он не возвращает информацию, в которой я нуждаюсь. Я прикрепил свой код. Ваша помощь очень ценится.

public class MainActivity extends AppCompatActivity { 
    @Bind(R.id.textView_userid) TextView textView_userid; 
    @Bind(R.id.textView_email) TextView textView_email; 
    @Bind(R.id.textView_password) TextView textView_password; 
    @Bind(R.id.textView_firstName) TextView textView_firstname; 
    @Bind(R.id.textView_lastname) TextView textView_lastname; 
    @Bind(R.id.refresh_button) Button refresh_button; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build()); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ButterKnife.bind(this); 

    } 

    @OnClick(R.id.refresh_button) 
    public void onClick_Refresh(){ 


     UserApi.Factory.getInstance().getUsers().enqueue(new Callback<User>() { 
      @Override 
      public void onResponse(Response<User> response, Retrofit retrofit) { 
       textView_userid.setText(response.body().getUserId()); 
       textView_email.setText(response.body().getEmail()); 
       textView_firstname.setText(response.body().getFirstName()); 
       textView_lastname.setText(response.body().getLastName()); 
       Log.e("Info", response.body().toString()); 
       Log.v("Get", response.body().toString()); 
      } 

      @Override 
      public void onFailure(Throwable t) { 
       Log.e("failed", t.getMessage()); 

      } 
     }); 
    } 
    @Override 
    protected void onResume(){ 
     super.onResume(); 
     onClick_Refresh(); 
    } 
} 


public interface UserApi { 
    String baseUrl = "http://someUrl/"; 

    @GET("users") 
    Call<User> getUsers(); 

    class Factory{ 
     private static UserApi service; 
     public static UserApi getInstance(){ 
      if(service == null){ 
       Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(baseUrl).build(); 
       service = retrofit.create(UserApi.class); 
       return service; 
      }else{ 
       return service; 
      } 
     } 
    } 
} 

@generated ("org.jsonschema2pojo") общественного класса пользователя {

@SerializedName("userId") 
@Expose 
private int userId; 
@SerializedName("email") 
@Expose 
private String email; 
@SerializedName("firstName") 
@Expose 
private String firstName; 
@SerializedName("lastName") 
@Expose 
private String lastName; 

/** 
* 
* @return 
*  The userId 
*/ 
public int getUserId() { 
    return userId; 
} 

/** 
* 
* @param userId 
*  The userId 
*/ 
public void setUserId(int userId) { 
    this.userId = userId; 
} 

/** 
* 
* @return 
*  The email 
*/ 
public String getEmail() { 
    return email; 
} 

/** 
* 
* @param email 
*  The email 
*/ 
public void setEmail(String email) { 
    this.email = email; 
} 

/** 
* 
* @return 
*  The firstName 
*/ 
public String getFirstName() { 
    return firstName; 
} 

/** 
* 
* @param firstName 
*  The firstName 
*/ 
public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

/** 
* 
* @return 
*  The lastName 
*/ 
public String getLastName() { 
    return lastName; 
} 

/** 
* 
* @param lastName 
*  The lastName 
*/ 
public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

}

[{"userId":1,"email":"[email protected]","password":"abc123","firstName":"bob","lastName":"joe"}] 
+0

Ваш вопрос недостаточно ясен, можете ли вы рассказать нам, какой метод точно выдает исключение. В любом случае из текста ошибки в заголовке я заключаю, что метод ожидает объект JSON, а не массив JSON. – stjepano

+0

Также вы можете посмотреть http://stackoverflow.com/a/23670188/2450855 –

ответ

0

JSON чик вы предоставили показывает, что вы получаете массив вместо объекта попробуйте изменить следующий код:

UserApi.Factory.getInstance().getUsers().enqueue(new Callback<User>() { 
      @Override 
      public void onResponse(Response<User> response, Retrofit retrofit) { 

      } 
      @Override 
      public void onFailure(Throwable t) { 
       Log.e("failed", t.getMessage()); 

      } 
     }); 

Чтобы что-то вроде этого:

UserApi.Factory.getInstance().getUsers().enqueue(new Callback<List<User>>() { 
      @Override 
      public void onResponse(Response<List<User>> response, Retrofit retrofit) { 
        List<User> users = response.body; 
        // Do something with the rest 
       } 
      @Override 
      public void onFailure(Throwable t) { 
        Log.e("failed", t.getMessage()); 

      } 
     }); 
0

Во-первых, изменение тела onResponse к

@Override 
     public void onResponse(Response<List<User>> response, Retrofit retrofit) { 
       List<User> users = response.body; 

      } 

Во-вторых, для determinig, где ожидать JSONObject или jsonArray, вы можете использовать этот веб-сайт, где you can get equivalent POJO for any Json response.

0

Спасибо, ребята, за вашу помощь. Я некоторые изменения в моем интерфейсе и основной деятельности. Результат ниже работал.

UserApi.Factory.getInstance().getUsers().enqueue(new Callback<List<User>>() { 
     @Override 
     public void onResponse(Response<List<User>> response, Retrofit retrofit) { 
      for(User user: response.body()){ 
      Log.v("Endpoint Response: ", user.toString()); 
       textView_userid.setText(String.valueOf(user.getUserId())); 
       textView_email.setText(user.getEmail()); 
       textView_firstname.setText(user.getFirstName()); 
       textView_lastname.setText(user.getLastName()); 
      } 

     } 

     @Override 
     public void onFailure(Throwable t) { 
      Log.e("failed", t.getMessage()); 

     } 
    }); 


@GET("users") 
Call<List<User>> getUsers(); 

class Factory{ 
    private static UserApi service; 
    public static UserApi getInstance(){ 
     if(service == null){ 
      Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(baseUrl).build(); 
      service = retrofit.create(UserApi.class); 
      return service; 
     }else{ 
      return service; 
     } 
    } 
} 
Смежные вопросы