2014-02-13 116 views
2

我跟隨tutorial瞭解如何爲移動設備構建後端,並且能夠爲我的Android應用程序創建後端並在GAE上存儲Entites。問題是,知道如何找回我用下面的代碼我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; 
    } 
} 

在我onCreate()方法new EndpointsTask().execute(getApplicationContext());的調用。

存取實體的屬性,並顯示它們使用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; 
}} 

,然後在我的onCreate() method.When叫new EndpointsTask().execute(getApplicationContext());我試圖運行應用程序,我不沒有任何東西。 我花了幾個小時尋找如何做到這一點,但我只找到保存實體的教程。 任何幫助,將不勝感激。

+0

您可以發佈您的用戶實體源代碼嗎? – Gomino

+0

還你的Userendpoint getUser方法 – Gomino

+0

@gomino請找到這兩個[這裏](https://gist.github.com/JudeOchalifu/9128082) –

回答

2

你的問題是你正在嘗試更新後臺線程中的用戶界面。在從GAE中檢索用戶之後,應該將其作爲結果傳遞給在主線程上執行的onPostExecute,然後在那裏更新您的UI。這裏是你的代碼中需要的變化的快速草稿,以使其工作。

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 user = new User()」行應該替換爲「User result = ...」。你正在創建一個新的(可能是空的)用戶實例,用來填充TextViews。您應該使用從服務器獲取的實例。

編輯:這樣的: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()'等而不創建用戶。 –

相關問題