Извлечение сущности из бэкэнда Google App Engine в приложение Android

Я следовал учебному пособию о том, как создать бэкэнд для мобильных устройств, и смог создать бэкэнд для моего приложения для Android и хранить Entites в GAE. Проблема в том, что я не знаю, как получить свойства моего объекта. entites я использовал следующий код:

public class EndpointsTask extends AsyncTask<Context, Integer, Long> {
    protected Long doInBackground(Context... contexts) {

        Userendpoint.Builder endpointBuilder = new Userendpoint.Builder(
                AndroidHttp.newCompatibleTransport(),
                new JacksonFactory(),
                new HttpRequestInitializer() {
                    public void initialize(HttpRequest httpRequest) { }
                });
        Userendpoint endpoint = CloudEndpointUtils.updateBuilder(
                endpointBuilder).build();
        try {
            User user = new User();
            String username;


                  if (responseCheckbox.isChecked()) {

                    username = MainActivity.getPersonName();
                  } 
                  else {
                      username = usernameTextField.getText().toString();
                  }
            String location = locationTextField.getText().toString();
            String tempAge = ageTextField.getText().toString();
            String tempWeight = weightTextField.getText().toString();
            String gender = genderTextField.getText().toString();
            String occupation = occupationTextField.getText().toString();
            int age  = Integer.parseInt(tempAge);
            int weight = Integer.parseInt(tempWeight);


            user.setUsername(username);
            user.setLocation(location);
            user.setAge(age);
            user.setWeight(weight);
            user.setGender(gender);
            user.setOccupation(occupation);

            @SuppressWarnings("unused")
            User result;
            result = endpoint.insertUser(user).execute();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return (long) 0;
    }
}

с призывом к new EndpointsTask().execute(getApplicationContext()); в моем onCreate() метод.

Чтобы получить свойства сущности и отобразить их, используя TextViews вот что я пробовал:

public class EndpointsTask extends AsyncTask<Context, Integer, Long> {
protected Long doInBackground(Context... contexts) {

    Userendpoint.Builder endpointBuilder = new Userendpoint.Builder(
            AndroidHttp.newCompatibleTransport(),
            new JacksonFactory(),
            new HttpRequestInitializer() {
                public void initialize(HttpRequest httpRequest) { }
            });
    Userendpoint endpoint = CloudEndpointUtils.updateBuilder(
            endpointBuilder).build();

try {
    User user = new User();
    usernameTextView.setText(user.getUsername());
    locationTextView.setText(user.getLocation());
    ageTextView.setText(user.getAge());
    occupationTextView.setText(user.getOccupation());
    weightTextView.setText(user.getWeight());
    genderTextView.setText(user.getGender());

    User result = endpoint.getUser(user.getUsername()).execute();

} catch (Exception e) {
    e.printStackTrace();
}
return (long) 0;
}}

а потом позвонил new EndpointsTask().execute(getApplicationContext()); в моем onCreate() method.When я пытался запустить приложение, я ничего не получаю. Я потратил несколько часов на поиски, как это сделать, но я нахожу только учебники по сохранению энтитов. Любая помощь будет оценена.

2 ответа

Решение

Ваша проблема в том, что вы пытаетесь обновить пользовательский интерфейс в фоновом потоке. После извлечения пользователя из GAE вы должны в результате передать его onPostExecute, который выполняется в главном потоке, а затем обновить там свой пользовательский интерфейс. Вот краткий черновик изменений, которые вам нужны в вашем коде, чтобы он заработал.

public class EndpointsTask extends AsyncTask<Context, Integer, User> {

   protected User doInBackground(Context... contexts) {

        Userendpoint.Builder endpointBuilder = new Userendpoint.Builder(
            AndroidHttp.newCompatibleTransport(),
            new JacksonFactory(),
            new HttpRequestInitializer() {
                public void initialize(HttpRequest httpRequest) { }
            });
        Userendpoint endpoint = CloudEndpointUtils.updateBuilder(
            endpointBuilder).build();

        User user = null;
        try {
            user = endpoint.getUser("username").execute();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return user;
  }

  protected void onPostExecute(User user) {
        //update your UI here
        usernameTextView.setText(user.getUsername());
        locationTextView.setText(user.getLocation());
        ageTextView.setText(Integer.toString(user.getAge()));
        occupationTextView.setText(user.getOccupation());
        weightTextView.setText(Integer.toString(user.getWeight()));
        genderTextView.setText(user.getGender());
  }

}

Строка "User user = new User()" должна быть заменена на " User result = ...". Вы создаете новый (возможно, пустой) экземпляр пользователя, который вы используете для заполнения TextViews. Вместо этого вы должны использовать экземпляр, полученный с сервера.

РЕДАКТИРОВАТЬ: как это: https://gist.github.com/TomTasche/e574b4d98269f6533405

Более того, лучше всего заниматься пользовательским интерфейсом в основном потоке. Итак, что вы должны сделать, это вернуть "Результат пользователя" и использовать его в onPostExecuted() для заполнения вашего TextView.

Другие вопросы по тегам