- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我关注了这个 tutorial用于设置我的 Google App Engine 实例,我也在使用 Firebase。我的目标是将所有“计算”放在 Google App Engine 上。我想在下面调用这样的函数:
我的端点:
package productions.widowmaker110.backend;
/** An endpoint class we are exposing */
@Api(
name = "myApi",
version = "v1",
namespace = @ApiNamespace(
ownerDomain = "backend.widowmaker110.productions",
ownerName = "backend.widowmaker110.productions",
packagePath=""
)
)
public class MyEndpoint {
/** A simple endpoint method that takes a name and says Hi back */
@ApiMethod(name = "sayHi")
public MyBean sayHi(@Named("name") String name) {
// Write a message to the database
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("message");
// Read from the database
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
String value = dataSnapshot.getValue(String.class);
Log.d(TAG, "Value is: " + value);
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
Log.w(TAG, "Failed to read value.", error.toException());
}
});
MyBean response = new MyBean();
response.setData("Hi, " + name);
return response;
}
}
package productions.widowmaker110.gpsweather;
// imports...
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred"));
}
class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> {
private MyApi myApiService = null;
private Context context;
@Override
protected String doInBackground(Pair<Context, String>... params) {
if(myApiService == null) { // Only do this once
MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(), null)
// options for running against local devappserver
// - 10.0.2.2 is localhost's IP address in Android emulator
// - turn off compression when running against local devappserver
.setRootUrl("http://10.0.2.2:8080/_ah/api/")
.setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() {
@Override
public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException {
abstractGoogleClientRequest.setDisableGZipContent(true);
}
});
// end options for devappserver
myApiService = builder.build();
}
context = params[0].first;
String name = params[0].second;
try {
return myApiService.sayHi(name).execute().getData();
} catch (IOException e) {
return e.getMessage();
}
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(context, result, Toast.LENGTH_LONG).show();
}
}
}
最佳答案
您需要使用 Firebase Server SDK 进行服务器端调用。您可以在此处找到有关设置和使用它的信息:
Add Firebase to your Server
Firebase Server SDK Installation & Setup
将 Firebase 与 Google Cloud Endpoints 结合使用时请注意,您需要将 Firebase 方法与 Tasks API 结合使用.由于 Firebase 方法不会阻塞,如果您不使用 Tasks,您的 Endpoint 将在您对 Firebase 进行的调用有机会返回其结果之前返回。有关使用任务的简要介绍,请查看下面的链接。这是在 2016 年 Google I/O 上的演讲。演讲者谈论的是 Android 上的 Tasks 和 Firebase,但在服务器上使用 Tasks 和 Firebase 时的概念是相同的。请注意,它们已将 Tasks API 与 Firebase Server SDK 一起包含在内。我已经跳到了直接处理任务的那部分。
Firebase SDK for Android: A tech deep dive
以下示例适用于您是否需要在 Endpoint 返回值之前处理 Firebase 读/写操作的结果,或者其他代码是否取决于 Firebase 读/写操作的结果。这些是服务器端示例。我假设你关心写操作是否成功。可能有更好的方法来执行这些服务器端操作,但这是我迄今为止所做的。
使用 setValue() 的写操作示例:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
YourModelClass obj = new YourModelClass();
setValue()
时方法它返回一个 Task
对象,保留对它的引用。Task<Void> setValueTask = ref.setValue(obj);
TaskCompletionSource
目的。此对象应使用您选择的结果类型进行参数化。我要使用 Boolean
作为此示例的结果类型。final TaskCompletionSource<Boolean> tcs = new TaskCompletionSource<>();
Task
来自 TaskCompletionSource
在步骤 2 中创建的。同样,生成的 Task
应该使用与 TaskCompletionSource
相同的参数类型目的。Task<Boolean> tcsTask = tcs.getTask();
Task
添加完成监听器这是由对 setValue()
的调用生成的.在完成监听器中,在 Task
上设置适当的结果在步骤 3 中创建。调用 setResult()
在您的 TaskCompletionSouce
对象将标记 Task
从它创建的完整。这对于第 5 步很重要。setValueTask.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
tcs.setResult(true);
}else{
tcs.setResult(false);
}
}
});
Task.await()
阻塞当前线程直到 Task
你感兴趣的已经完成。我们正在等待 Task
由 TaskCompletionSource
生成对象被标记为完成。此 Task
当我们拨打 setResult()
时将被视为完整在 TaskCompletionSource
用于生成 Task
正如我们在第 4 步中所做的那样。一旦完成,它将返回结果。try {
Boolean result = Tasks.await(tcsTask);
}catch(ExecutionException e){
//handle exception
}catch (InterruptedException e){
//handle exception
}
Tasks.await()
返回一个值。您还可以(并且应该)在
Tasks.await()
上设置超时值。方法,如果你想保持当前线程不被无限期阻塞。
Task
是否感兴趣由
setValue()
生成完成并且不关心它是否成功那么您可以跳过
TaskCompletionSource
的创建只需使用
Tasks.await()
直接在那
Task
.同样适用于
updateChildren()
.如果你愿意,你可以只使用
updateChilden()
的方法调用或
setValue()
其中使用
DatabaseReference.CompletionListener
以及一个 TaskCompletionListener。
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
YourModelClass mModelClassObject;
TaskCompletionSource
用您期望的结果参数化的对象 Task
这将从它产生。final TaskCompletionSource<YourModelClass> tcs = new TaskCompletionSource<>();
Task
来自 TaskCompletionSource
目的Task<YourModelClass> tcsTask = tcs.getTask();
addListenerForSingleValueEvent()
在我们的 DatabaseReference
并调用 setResult()
在 Task
在步骤 2 中生成。ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
YourModelClass result = dataSnapshot.getValue(YourModelClass.class);
if(result != null){
tcs.setResult(result);
}
}
@Override
public void onCancelled(DatabaseError databaseError){
//handle error
}
});
Tasks.await()
阻塞当前线程直到 Task
你感兴趣的已经完成。 Task
当我们拨打 setResult()
时将被视为完整正如我们在第 3 步中所做的那样,将返回结果。try {
mModelClassObject = Tasks.await(tcsTask);
}catch(ExecutionException e){
//handle exception
}catch (InterruptedException e){
//handle exception
}
Tasks.await()
方法以及超时值以防止当前线程被无限期阻塞。
关于java - 从 Google App Engine 调用 Firebase 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37892336/
Google Cloud Compute 中的 Google Compute Engine、App Engine 和 Container Engine 之间的实际区别是什么?什么时候使用什么? 有什么
我有一个在 Google App Engine 中运行的应用程序,它访问在 Google Compute Engine 中的机器上运行的服务。 Google App Engine 应用程序是该服务唯一
我们正在谷歌云中构建一个应用程序。我们使用 App Engine 作为前端,使用 Compute Engine 作为后端。在这些 Compute Engine 实例上,我正在运行一个接受特定“命令”消
我有一个现有的 GAE 应用程序(我们称之为应用程序 A)正在运行的情况,但由于非技术原因无法修改。当用户迁移到新的客户端版本时,我们需要将他们的数据从应用程序 A 迁移到新的 GAE 应用程序(我称
我正在尝试发现 App Engine 上的其他已部署服务。类似于 this文章建议。 我的代码是这样的: import ( "fmt" "net/http" "google.g
我想在我的网站上为“图像处理”事件设置服务器。如果我在 GCE 中使用“n1-standard-1”实例,GAE 中的可比功率是多少?是因为我算错了,还是同一个功率两者价格相差很大? 最佳答案 按小时
我在 Googl Compute Engine 和 Google App Engine 标准环境中的应用程序中创建了一个 VM 实例。我打算在 App Engine 中使用我的应用程序,在 Compu
我像往常一样使用 appcfg.py 更新我的应用程序,但收到一条错误消息。我试过 appcfg.py 回滚,两次尝试之间等了十分钟,但我仍然收到相同的错误消息。我该怎么办? 无法对 apps/dev
我想在 Google Compute Engine 上放置一个 Redis 服务器,并通过 AppEngine 的套接字支持与其对话。唯一的问题是似乎没有特定的防火墙规则说“此 AppEngine 应
我想知道 App Engine 和 Compute Engine 之间有什么区别。任何人都可以向我解释其中的区别吗? 最佳答案 App Engine 是一种平台即服务。这意味着您只需部署代码,平台会为
我正在编写一个在 App Engine 的 Go 运行时上运行的 Go 应用程序。 我注意到几乎所有使用 App Engine 服务(例如 Datastore、Mail 甚至 Capabilities
是否有人有在 Grid Engine/Sun Grid Engine/Son of Grid Engine 上运行 Docker 的经验,并且能够 monitor the resource used
我读了很多论坛,因为 grails app-engine 插件多年来没有更新,所以不可能将 grails 应用程序部署到谷歌应用程序引擎。当我准备放弃时,我发现使用 intellij 部署项目是可能的
当前设置, 运行 Windows Server 2012 (GCE Server 2012) 的谷歌计算引擎 运行 Debian Wheezy(GCE 服务器 Wheezy)的 Google 计算引擎
特定于基于 Docker 的部署,这两者之间有什么区别?由于 Google App Engine Flexible 现在也支持基于 Dockerfile 的部署,并且它也是完全托管的服务,因此它似乎比
我相信 Google Kubernetes Engine (GKE) 在 Google Compute Engine (GCE) 上运行。那么,在服务器管理方面使用 Google Kubernetes
TLDR;关于这个问题有任何更新吗? Google App Engine communicate with Compute Engine over internal network -- 是否可以在同
我正在尝试使用 Go SDK 为 App Engine 编写应用程序,但它似乎与单元测试有一种有趣的关系。人有written libraries左右this original, outdated一组工
在 App Engine 中,我想对在同一个 Google 云项目中创建的 Compute Engine 实例上运行的网络服务器进行 http fetch 调用,我想知道是否可以在不启用的情况下对实例
在编写 Go App Engine 标准应用程序时,过去的情况是您必须使用 App Engine SDK访问数据存储。然而,最近(从 Go 1.11 开始?),如果你只使用 Cloud Datasto
我是一名优秀的程序员,十分优秀!