您好我是android.i的新手正在创建一个简单的google cloud appengine应用程序,使用endpoint.i正在使用本教程https://github.com/GoogleCloudPlatform/gradle-appengine-templates/tree/master/HelloEndpoints。但问题是我想在textview中显示结果而不是在烤面包。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/lay1">
<EditText
android:id="@+id/edt1"
android:layout_width="match_parent"
android:layout_height="100dp"
android:hint="Enter Number"
android:inputType="number"
android:textSize="24sp" />
<EditText
android:id="@+id/edt2"
android:layout_width="match_parent"
android:layout_height="100dp"
android:hint="Enter Number"
android:inputType="number"
android:textSize="24sp" />
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="100dp"
android:hint="Result Will be Here"
android:textSize="24sp" />
<Button
android:id="@+id/btnAdd"
android:layout_width="match_parent"
android:layout_height="100dp"
android:text="Add" />
</LinearLayout>
package com.ontech.googleappengine;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Pair;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class GoogleAppEngActivity extends AppCompatActivity {
Button btnAdd;
TextView tv1;
//String val1,val2;
EditText edt1,edt2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_google_app_eng);
edt1=(EditText)findViewById(R.id.edt1);
edt2=(EditText)findViewById(R.id.edt2);
tv1=(TextView)findViewById(R.id.tv1);
btnAdd =(Button)findViewById(R.id.btnAdd);
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String temp = "";
temp = edt1.getText().toString();
temp += "+";
temp += edt2.getText().toString();
new EndpointsAsyncTask().execute(new Pair<Context, String>(GoogleAppEngActivity.this, temp));
// tv1.setText( new EndpointsAsyncTask().);
}
});
// new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred"));
}
public TextView getTextView(){
TextView txtView=(TextView)findViewById(R.id.tv1);
return txtView;
}
}
package com.ontech.googleappengine;
//package com.ontech.googleappengine;
import android.content.Context;
import android.os.AsyncTask;
import android.text.Layout;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.extensions.android.json.AndroidJsonFactory;
import com.google.api.client.googleapis.services.AbstractGoogleClientRequest;
import com.google.api.client.googleapis.services.GoogleClientRequestInitializer;
import com.ontech.myapplication.backend.myApi.MyApi;
import java.io.IOException;
/**
* Created by on 05-11-2015.
*/
public class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> {
private static 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);
}
});*/
MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null)
.setRootUrl("https://leafy-display-112017.appspot.com/_ah/api/");
// 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();
}
}
package com.ontech.myapplication.backend;
import com.google.api.server.spi.config.Api;
import com.google.api.server.spi.config.ApiMethod;
import com.google.api.server.spi.config.ApiNamespace;
import javax.inject.Named;
/**
* An endpoint class we are exposing
*/
@Api(
name = "myApi",
version = "v1",
namespace = @ApiNamespace(
ownerDomain = "backend.myapplication.ontech.com",
ownerName = "backend.myapplication.ontech.com",
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) {
MyBean response = new MyBean();
String val1, val2;
val1 = name.substring(0, name.indexOf("+"));
val2 = name.substring(name.indexOf("+") + 1);
int res = Integer.parseInt(val1) + Integer.parseInt(val2);
// response.setData("Hi, " + name);
response.setData(Integer.toString(res));
return response;
}
}
package com.ontech.myapplication.backend;
/**
* The object model for the data we are sending through endpoints
*/
public class MyBean {
private String myData;
public String getData() {
return myData;
}
public void setData(String data) {
myData = data;
}
}
答案 0 :(得分:0)
将 TextView 作为参数传递给 EndpointsAsyncTask 的构造函数,并在其中显示结果,如下所示。
public class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> {
private static MyApi myApiService = null;
private Context context;
private TextView textView
public EndpointsAsyncTask(Context context,TextView mtextView) {
// TODO Auto-generated constructor stub
this.context=context;
this.textView=mtextView;
}
@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);
}
});*/
MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null)
.setRootUrl("https://leafy-display-112017.appspot.com/_ah/api/");
// 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();
textView.setText(result);
}
}
从您的Activity或Fragment
调用AsyncTasknew EndpointsAsyncTask(context,yourTextView).execute(yourParams);
答案 1 :(得分:0)
在EndpointsAsyncTask.java中替换
@Override
protected void onPostExecute(String result) {
Toast.makeText(context, result, Toast.LENGTH_LONG).show();
}
使用
@Override
protected void onPostExecute(String result) {
GoogleAppEngActivity.getTextView().setText(result);
}
答案 2 :(得分:0)
更改为:GoogleAppEngActivity类中的new EndpointsAsyncTask(tv1)
并将下一个代码添加到EndpointsAsyncTask
类
TextView view;
public EndpointsAsyncTask(TextView tv) {
view = tv;
}
并替换Toast.makeText(context, result, Toast.LENGTH_LONG).show();
到view.setText(result);
答案 3 :(得分:0)
我建议将EndpointsAsyncTask作为您活动的内部类。在postExecute中获取对textView的引用并在那里更新它。像this
这样的东西答案 4 :(得分:0)
理想情况下,属于活动的UI元素应该在活动本身中更改,而不是在其他位置更改。请尝试按照演示模式进行操作。
一个小例子: 1.创建一个接口 - ActivityPresenter,其方法表示使用参数作为视图更改所需的输入数据的事件。一个例子是:
void onServerResponse(ServerResponse resp);
使活动实现此接口。也就是说,您可以定义服务器响应到达时在活动中进行的UI更改。
当您从活动中调用service / asynctask为您异步执行某项任务时,请发送活动presenter参考。从您的服务/ asynctask中调用presenter.onServerResponse(response)
。
答案 5 :(得分:0)
为此,您可以使用回调接口:
创建公共接口:
super.onCreate(savedInstanceState);
现在覆盖回调接口的方法并定义需要执行的操作,即设置TextView值。之后将其传递给异步任务类:
addPreferencesFromResource(R.xml.preferences);
现在在异步任务类中调用Callback接口方法并传递响应String以设置编辑文本值:
public interface AsyncTaskResponse {
void asyncTaskFinish(String output);
}