Извлечение сущности из бэкэнда 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.