2014-02-13 2 views
2

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

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() методе.

Чтобы получить свойства Entity и отображать их с помощью 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 я попытался запустить приложение, я не» t получить что-нибудь. Я потратил несколько часов на поиски, как это сделать, но я только нахожу учебники по сохранению entites. Любая помощь будет оценена по достоинству.

+0

Можете ли вы разместить исходный код вашего пользователя, пожалуйста? – Gomino

+0

А также ваш метод getUser Userendpoint – Gomino

+0

@gomino, пожалуйста, найдите эти два [здесь] (https://gist.github.com/JudeOchalifu/9128082) –

ответ

2

Ваша проблема в том, что вы пытаетесь обновить ui в фоновом потоке. После извлечения пользователя из 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()); 
    } 

} 
2

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

EDIT: как этот: https://gist.github.com/TomTasche/e574b4d98269f6533405

Кроме того, это лучшая практика, чтобы сделать материал UI в основном потоке. Так что вы должны сделать, это вернуть «Пользовательский результат» и использовать его в onPostExecuted(), чтобы заполнить ваш TextView.

+0

Привет, извините, но он все еще не работает. Напомню, что методы 'getUsername()', 'getAge()' и т. д. все принадлежат классу UserEndpoint'. Не могли бы вы объяснить, как я могу создать экземпляр с сервера? А вторая часть? Я довольно новичок в этом. –

+0

Хорошо, забудьте о второй части моего ответа. Это просто лучшая практика и не имеет значения в вашем случае. Вот как я думаю, ваш код должен выглядеть так: https://gist.github.com/TomTasche/e574b4d98269f6533405 - не забудьте заменить имя пользователя в строке # 14. – TomTasche

+0

В вашем примере вы используете 'user.getAge()' и т. Д. Без создания пользователя. –

Смежные вопросы