java - 无法将实体从 Android 应用程序保存到 Google App Engine 后端

标签 java android google-app-engine

我正在遵循 Google tutorial 中给出的示例为我的 Android 应用程序创建一个 Google App Engine 后端。 教程中MainActivity如下:

import java.io.IOException;
import java.util.Date;

import android.os.AsyncTask;
import android.content.Context;
import com.cloudnotes.noteendpoint.Noteendpoint;
import com.cloudnotes.noteendpoint.model.Note;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.json.jackson.JacksonFactory;


import android.os.Bundle;
import android.app.Activity;

import android.view.Menu;

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

  new EndpointsTask().execute(getApplicationContext());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

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

      Noteendpoint.Builder endpointBuilder = new Noteendpoint.Builder(
          AndroidHttp.newCompatibleTransport(),
          new JacksonFactory(),
          new HttpRequestInitializer() {
          public void initialize(HttpRequest httpRequest) { }
          });
  Noteendpoint endpoint = CloudEndpointUtils.updateBuilder(
  endpointBuilder).build();
  try {
      Note note = new Note().setDescription("Note Description");
      String noteID = new Date().toString();
      note.setId(noteID);

      note.setEmailAddress("E-Mail Address");      
      Note result = endpoint.insertNote(note).execute();
   } catch (IOException e) {
    e.printStackTrace();
   }
       return (long) 0;
    }
   }
   }

这工作正常,每次运行应用程序时都会创建实体。因此我通过添加 textfields 来修改它以获取 descriptionemail 来自用户并将其作为新的 MainActivity

public class MainActivity extends Activity implements View.OnClickListener{

EditText descriptionTF;
EditText emailTF;
Button submitBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    submitBtn  = (Button) findViewById(R.id.submitButton);
    descriptionTF = (EditText) findViewById(R.id.descriptionTextField);
    emailTF = (EditText) findViewById(R.id.emailTextField);
}

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

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

      String descrptn = descriptionTF.getText().toString();
      String email = emailTF.getText().toString();
      String noteID = new Date().toString();
  try {
      Note note = new Note();


      note.setDescription(descrptn);

      note.setId(noteID);

      note.setEmailAddress(email);      
      Note result = endpoint.insertNote(note).execute();
  } catch (IOException e) {
    e.printStackTrace();
  }
      return (long) 0;
    }
}

@Override
public void onClick(View v) {
    if (v.getId()== R.id.submitButton) {
     new EndpointsTask().execute(getApplicationContext());
    }
}
 }

现在,当我单击提交按钮时,什么也没有发生。 我猜问题出在我从 onClick() 方法而不是 onCreate() 调用 new EndpointsTask().execute(getApplicationContext()); 方法,就像教程中所做的那样。有人知道解决这个问题的方法吗?

最佳答案

最终通过将 onClick() 方法移动到 onCreate() 方法解决了这个问题,如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    submitBtn  = (Button) findViewById(R.id.submitButton);
    descriptionTF = (EditText) findViewById(R.id.descriptionTextField);
    emailTF = (EditText) findViewById(R.id.emailTextField);

    submitBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (v.getId()== R.id.submitButton) {
         new EndpointsTask().execute(getApplicationContext());
        }
        }
    });
}

关于java - 无法将实体从 Android 应用程序保存到 Google App Engine 后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21666872/

相关文章:

java - 对于rest api的(页面,大小)或(限制,偏移量),哪种分页方法更好

java - getActionBar().setDisplayHomeAsUpEnabled(true), -> java.lang.NullPointerException 无法解决

python - 谷歌应用引擎: LinkProperty to string

google-app-engine - AppEngine cpm_usd 变化

java - 在java appengine中获取http请求参数

java - 在 android 上使用 bufferedwriter 每秒写一次

java - 从 Okhttp 使用 One-Shot ResponseBody 会导致 Retrofit 出现问题

java - JTextPane 附加一个新字符串

android - OpenGL ES 2.0 方形看起来像矩形

android - 在 Activity 之间同步可打包状态?