Merge pull request #90 from zsurocking/master

Add Android Helloworld example
pull/3109/head
zsurocking 10 years ago
commit 785d3788b6
  1. 1
      README.md
  2. 184
      java/android/GreeterGrpc.java
  3. 175
      java/android/Helloworld.java
  4. 93
      java/android/HelloworldActivity.java
  5. 71
      java/android/README.md
  6. 54
      java/android/activity_helloworld.xml

@ -15,6 +15,7 @@ You can find quick start guides for each language, including installation instru
* [Go](https://github.com/grpc/grpc-common/tree/master/go)
* [ruby](https://github.com/grpc/grpc-common/tree/master/ruby)
* [Node.js](https://github.com/grpc/grpc-common/tree/master/node)
* [Android Java](https://github.com/grpc/grpc-common/tree/master/java/android)
* [Python](https://github.com/grpc/grpc-common/tree/master/python/helloworld)
## What's in this repository?

@ -0,0 +1,184 @@
package io.grpc.examples;
import static io.grpc.stub.Calls.createMethodDescriptor;
import static io.grpc.stub.Calls.asyncUnaryCall;
import static io.grpc.stub.Calls.asyncServerStreamingCall;
import static io.grpc.stub.Calls.asyncClientStreamingCall;
import static io.grpc.stub.Calls.duplexStreamingCall;
import static io.grpc.stub.Calls.blockingUnaryCall;
import static io.grpc.stub.Calls.blockingServerStreamingCall;
import static io.grpc.stub.Calls.unaryFutureCall;
import static io.grpc.stub.ServerCalls.createMethodDefinition;
import static io.grpc.stub.ServerCalls.asyncUnaryRequestCall;
import static io.grpc.stub.ServerCalls.asyncStreamingRequestCall;
import java.io.IOException;
public class GreeterGrpc {
private static final io.grpc.stub.Method<io.grpc.examples.Helloworld.HelloRequest,
io.grpc.examples.Helloworld.HelloReply> METHOD_SAY_HELLO =
io.grpc.stub.Method.create(
io.grpc.MethodType.UNARY, "SayHello",
io.grpc.nano.NanoUtils.<io.grpc.examples.Helloworld.HelloRequest>marshaller(
new io.grpc.nano.Parser<io.grpc.examples.Helloworld.HelloRequest>() {
@Override
public io.grpc.examples.Helloworld.HelloRequest parse(com.google.protobuf.nano.CodedInputByteBufferNano input) throws IOException {
return io.grpc.examples.Helloworld.HelloRequest.parseFrom(input);
}
}),
io.grpc.nano.NanoUtils.<io.grpc.examples.Helloworld.HelloReply>marshaller(
new io.grpc.nano.Parser<io.grpc.examples.Helloworld.HelloReply>() {
@Override
public io.grpc.examples.Helloworld.HelloReply parse(com.google.protobuf.nano.CodedInputByteBufferNano input) throws IOException {
return io.grpc.examples.Helloworld.HelloReply.parseFrom(input);
}
}));
public static GreeterStub newStub(io.grpc.Channel channel) {
return new GreeterStub(channel, CONFIG);
}
public static GreeterBlockingStub newBlockingStub(
io.grpc.Channel channel) {
return new GreeterBlockingStub(channel, CONFIG);
}
public static GreeterFutureStub newFutureStub(
io.grpc.Channel channel) {
return new GreeterFutureStub(channel, CONFIG);
}
public static final GreeterServiceDescriptor CONFIG =
new GreeterServiceDescriptor();
public static class GreeterServiceDescriptor extends
io.grpc.stub.AbstractServiceDescriptor<GreeterServiceDescriptor> {
public final io.grpc.MethodDescriptor<io.grpc.examples.Helloworld.HelloRequest,
io.grpc.examples.Helloworld.HelloReply> sayHello;
private GreeterServiceDescriptor() {
sayHello = createMethodDescriptor(
"helloworld.Greeter", METHOD_SAY_HELLO);
}
private GreeterServiceDescriptor(
java.util.Map<java.lang.String, io.grpc.MethodDescriptor<?, ?>> methodMap) {
sayHello = (io.grpc.MethodDescriptor<io.grpc.examples.Helloworld.HelloRequest,
io.grpc.examples.Helloworld.HelloReply>) methodMap.get(
CONFIG.sayHello.getName());
}
@java.lang.Override
protected GreeterServiceDescriptor build(
java.util.Map<java.lang.String, io.grpc.MethodDescriptor<?, ?>> methodMap) {
return new GreeterServiceDescriptor(methodMap);
}
@java.lang.Override
public com.google.common.collect.ImmutableList<io.grpc.MethodDescriptor<?, ?>> methods() {
return com.google.common.collect.ImmutableList.<io.grpc.MethodDescriptor<?, ?>>of(
sayHello);
}
}
public static interface Greeter {
public void sayHello(io.grpc.examples.Helloworld.HelloRequest request,
io.grpc.stub.StreamObserver<io.grpc.examples.Helloworld.HelloReply> responseObserver);
}
public static interface GreeterBlockingClient {
public io.grpc.examples.Helloworld.HelloReply sayHello(io.grpc.examples.Helloworld.HelloRequest request);
}
public static interface GreeterFutureClient {
public com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.Helloworld.HelloReply> sayHello(
io.grpc.examples.Helloworld.HelloRequest request);
}
public static class GreeterStub extends
io.grpc.stub.AbstractStub<GreeterStub, GreeterServiceDescriptor>
implements Greeter {
private GreeterStub(io.grpc.Channel channel,
GreeterServiceDescriptor config) {
super(channel, config);
}
@java.lang.Override
protected GreeterStub build(io.grpc.Channel channel,
GreeterServiceDescriptor config) {
return new GreeterStub(channel, config);
}
@java.lang.Override
public void sayHello(io.grpc.examples.Helloworld.HelloRequest request,
io.grpc.stub.StreamObserver<io.grpc.examples.Helloworld.HelloReply> responseObserver) {
asyncUnaryCall(
channel.newCall(config.sayHello), request, responseObserver);
}
}
public static class GreeterBlockingStub extends
io.grpc.stub.AbstractStub<GreeterBlockingStub, GreeterServiceDescriptor>
implements GreeterBlockingClient {
private GreeterBlockingStub(io.grpc.Channel channel,
GreeterServiceDescriptor config) {
super(channel, config);
}
@java.lang.Override
protected GreeterBlockingStub build(io.grpc.Channel channel,
GreeterServiceDescriptor config) {
return new GreeterBlockingStub(channel, config);
}
@java.lang.Override
public io.grpc.examples.Helloworld.HelloReply sayHello(io.grpc.examples.Helloworld.HelloRequest request) {
return blockingUnaryCall(
channel.newCall(config.sayHello), request);
}
}
public static class GreeterFutureStub extends
io.grpc.stub.AbstractStub<GreeterFutureStub, GreeterServiceDescriptor>
implements GreeterFutureClient {
private GreeterFutureStub(io.grpc.Channel channel,
GreeterServiceDescriptor config) {
super(channel, config);
}
@java.lang.Override
protected GreeterFutureStub build(io.grpc.Channel channel,
GreeterServiceDescriptor config) {
return new GreeterFutureStub(channel, config);
}
@java.lang.Override
public com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.Helloworld.HelloReply> sayHello(
io.grpc.examples.Helloworld.HelloRequest request) {
return unaryFutureCall(
channel.newCall(config.sayHello), request);
}
}
public static io.grpc.ServerServiceDefinition bindService(
final Greeter serviceImpl) {
return io.grpc.ServerServiceDefinition.builder("helloworld.Greeter")
.addMethod(createMethodDefinition(
METHOD_SAY_HELLO,
asyncUnaryRequestCall(
new io.grpc.stub.ServerCalls.UnaryRequestMethod<
io.grpc.examples.Helloworld.HelloRequest,
io.grpc.examples.Helloworld.HelloReply>() {
@java.lang.Override
public void invoke(
io.grpc.examples.Helloworld.HelloRequest request,
io.grpc.stub.StreamObserver<io.grpc.examples.Helloworld.HelloReply> responseObserver) {
serviceImpl.sayHello(request, responseObserver);
}
}))).build();
}
}

@ -0,0 +1,175 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
package io.grpc.examples;
@SuppressWarnings("hiding")
public interface Helloworld {
public static final class HelloRequest extends
com.google.protobuf.nano.MessageNano {
private static volatile HelloRequest[] _emptyArray;
public static HelloRequest[] emptyArray() {
// Lazily initializes the empty array
if (_emptyArray == null) {
synchronized (
com.google.protobuf.nano.InternalNano.LAZY_INIT_LOCK) {
if (_emptyArray == null) {
_emptyArray = new HelloRequest[0];
}
}
}
return _emptyArray;
}
// optional string name = 1;
public java.lang.String name;
public HelloRequest() {
clear();
}
public HelloRequest clear() {
name = "";
cachedSize = -1;
return this;
}
@Override
public void writeTo(com.google.protobuf.nano.CodedOutputByteBufferNano output)
throws java.io.IOException {
if (!this.name.equals("")) {
output.writeString(1, this.name);
}
super.writeTo(output);
}
@Override
protected int computeSerializedSize() {
int size = super.computeSerializedSize();
if (!this.name.equals("")) {
size += com.google.protobuf.nano.CodedOutputByteBufferNano
.computeStringSize(1, this.name);
}
return size;
}
@Override
public HelloRequest mergeFrom(
com.google.protobuf.nano.CodedInputByteBufferNano input)
throws java.io.IOException {
while (true) {
int tag = input.readTag();
switch (tag) {
case 0:
return this;
default: {
if (!com.google.protobuf.nano.WireFormatNano.parseUnknownField(input, tag)) {
return this;
}
break;
}
case 10: {
this.name = input.readString();
break;
}
}
}
}
public static HelloRequest parseFrom(byte[] data)
throws com.google.protobuf.nano.InvalidProtocolBufferNanoException {
return com.google.protobuf.nano.MessageNano.mergeFrom(new HelloRequest(), data);
}
public static HelloRequest parseFrom(
com.google.protobuf.nano.CodedInputByteBufferNano input)
throws java.io.IOException {
return new HelloRequest().mergeFrom(input);
}
}
public static final class HelloReply extends
com.google.protobuf.nano.MessageNano {
private static volatile HelloReply[] _emptyArray;
public static HelloReply[] emptyArray() {
// Lazily initializes the empty array
if (_emptyArray == null) {
synchronized (
com.google.protobuf.nano.InternalNano.LAZY_INIT_LOCK) {
if (_emptyArray == null) {
_emptyArray = new HelloReply[0];
}
}
}
return _emptyArray;
}
// optional string message = 1;
public java.lang.String message;
public HelloReply() {
clear();
}
public HelloReply clear() {
message = "";
cachedSize = -1;
return this;
}
@Override
public void writeTo(com.google.protobuf.nano.CodedOutputByteBufferNano output)
throws java.io.IOException {
if (!this.message.equals("")) {
output.writeString(1, this.message);
}
super.writeTo(output);
}
@Override
protected int computeSerializedSize() {
int size = super.computeSerializedSize();
if (!this.message.equals("")) {
size += com.google.protobuf.nano.CodedOutputByteBufferNano
.computeStringSize(1, this.message);
}
return size;
}
@Override
public HelloReply mergeFrom(
com.google.protobuf.nano.CodedInputByteBufferNano input)
throws java.io.IOException {
while (true) {
int tag = input.readTag();
switch (tag) {
case 0:
return this;
default: {
if (!com.google.protobuf.nano.WireFormatNano.parseUnknownField(input, tag)) {
return this;
}
break;
}
case 10: {
this.message = input.readString();
break;
}
}
}
}
public static HelloReply parseFrom(byte[] data)
throws com.google.protobuf.nano.InvalidProtocolBufferNanoException {
return com.google.protobuf.nano.MessageNano.mergeFrom(new HelloReply(), data);
}
public static HelloReply parseFrom(
com.google.protobuf.nano.CodedInputByteBufferNano input)
throws java.io.IOException {
return new HelloReply().mergeFrom(input);
}
}
}

@ -0,0 +1,93 @@
package io.grpc.helloworldexample;
import android.content.Context;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import io.grpc.ChannelImpl;
import ex.grpc.GreeterGrpc;
import ex.grpc.Helloworld.HelloRequest;
import ex.grpc.Helloworld.HelloReply;
import io.grpc.transport.okhttp.OkHttpChannelBuilder;
import java.util.concurrent.TimeUnit;
public class Helloworld extends ActionBarActivity {
private Button mSendButton;
private EditText mHostEdit;
private EditText mPortEdit;
private EditText mMessageEdit;
private TextView mResultText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_helloworld);
mSendButton = (Button) findViewById(R.id.send_button);
mHostEdit = (EditText) findViewById(R.id.host_edit_text);
mPortEdit = (EditText) findViewById(R.id.port_edit_text);
mMessageEdit = (EditText) findViewById(R.id.message_edit_text);
mResultText = (TextView) findViewById(R.id.grpc_response_text);
}
public void sendMessage(View view) {
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(mHostEdit.getWindowToken(), 0);
mSendButton.setEnabled(false);
new GrpcTask().execute();
}
private class GrpcTask extends AsyncTask<Void, Void, String> {
private String mHost;
private String mMessage;
private int mPort;
private ChannelImpl mChannel;
@Override
protected void onPreExecute() {
mHost = mHostEdit.getText().toString();
mMessage = mMessageEdit.getText().toString();
String portStr = mPortEdit.getText().toString();
mPort = TextUtils.isEmpty(portStr) ? 0 : Integer.valueOf(portStr);
mResultText.setText("");
}
private String sayHello(ChannelImpl channel) {
GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);
HelloRequest message = new HelloRequest();
message.name = mMessage;
HelloReply reply = stub.sayHello(message);
return reply.message;
}
@Override
protected String doInBackground(Void... nothing) {
try {
mChannel = OkHttpChannelBuilder.forAddress(mHost, mPort).build();
return sayHello(mChannel);
} catch (Exception e) {
return "Failed... : " + e.getMessage();
}
}
@Override
protected void onPostExecute(String result) {
try {
mChannel.shutdown().awaitTerminated(1, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
mResultText.setText(result);
mSendButton.setEnabled(true);
}
}
}

@ -0,0 +1,71 @@
gRPC Hello World Tutorial (Android Java)
========================
BACKGROUND
-------------
For this sample, we've already generated the server and client stubs from [helloworld.proto](https://github.com/grpc/grpc-common/blob/master/protos/helloworld.proto).
PREREQUISITES
-------------
- [Java gRPC](https://github.com/grpc/grpc-java)
- [Android Tutorial](https://developer.android.com/training/basics/firstapp/index.html) If you're new to Android development
- We only have Android gRPC client in this example. Please follow examples in other languages to build and run a gRPC server.
INSTALL
-------
1 Clone the gRPC Java git repo
```sh
$ git clone https://github.com/grpc/grpc-java
```
2 Install gRPC Java, as described in [How to Build](https://github.com/grpc/grpc-java#how-to-build)
```sh
$ # from this dir
$ cd grpc-java
$ # follow the instructions in 'How to Build'
```
3 [Create an Android project](https://developer.android.com/training/basics/firstapp/creating-project.html) under your working directory.
- Set Application name to "Helloworld Example" and set Company Domain to "grpc.io". Make sure your package name is "io.grpc.helloworldexample"
- Choose appropriate minimum SDK
- Use Blank Activity
- Set Activity Name to HelloworldActivity
- Set Layout Name to activity_helloworld
4 Prepare the app
- Clone this git repo
```sh
$ git clone https://github.com/grpc/grpc-common
```
- Replace the generated HelloworldActivity.java and activity_helloworld.xml with the two files in this repo
- Copy GreeterGrpc.java and Helloworld.java under your_app_dir/app/src/main/java/io/grpc/examples/
- In your AndroidManifest.xml, make sure you have
```sh
<uses-permission android:name="android.permission.INTERNET" />
```
added outside your appplication tag
5 Add dependencies. gRPC Java on Android depends on grpc-java, protobuf nano, okhttp
- Copy grpc-java .jar files to your_app_dir/app/libs/:
- grpc-java/core/build/libs/*.jar
- grpc-java/stub/build/libs/*.jar
- grpc-java/nano/build/libs/*.jar
- grpc-java/okhttp/build/libs/*.jar
- Copy or download other dependencies to your_app_dir/app/libs/:
- [Guava 18](http://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar)
- [okhttp 2.2.0](http://repo1.maven.org/maven2/com/squareup/okhttp/okhttp/2.2.0/okhttp-2.2.0.jar)
- protobuf nano:
```sh
$ cp ~/.m2/repository/com/google/protobuf/nano/protobuf-javanano/2.6.2-pre/protobuf-javanano-2.6.2-pre.jar your_app_dir/app/libs/
```
- Make sure your_app_dir/app/build.gradle contains:
```sh
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
```
6 [Run your example app](https://developer.android.com/training/basics/firstapp/running-app.html)

@ -0,0 +1,54 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/host_edit_text"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Enter Host" />
<EditText
android:id="@+id/port_edit_text"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:hint="Enter Port" />
</LinearLayout>
<EditText
android:id="@+id/message_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter message to send" />
<Button
android:id="@+id/send_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="sendMessage"
android:text="Send Grpc Request" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:textSize="16dp"
android:text="Response:" />
<TextView
android:id="@+id/grpc_response_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="16dp" />
</LinearLayout>
Loading…
Cancel
Save