我正在学习使用谷歌云端点。我试图从我的设备连接,但我一直收到错误。
在20000ms后无法连接到/192.168.1.100(端口8080):isConnected失败:ECONNREFUSED(连接被拒绝)
如何克服此问题,我想在真实设备上运行?
获取Jokes.class
public class GetJokes 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);
}
});
// 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();
Log.i("Failed to con", result);
}
}
MainActivityFragment.class
public class MainActivityFragment extends Fragment {
public static final String JOKE = "JOKE";
public MainActivityFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_main, container, false);
Button tellJokeButton = (Button)root.findViewById(R.id.tellJoke_button);
tellJokeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new GetJokes().execute(new Pair<Context, String>(getActivity(), "Manfred"));
}
});
AdView mAdView = (AdView) root.findViewById(R.id.adView);
// Create an ad request. Check logcat output for the hashed device ID to
// get test ads on a physical device. e.g.
// "Use AdRequest.Builder.addTestDevice("ABCDEF012345") to get test ads on this device."
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.build();
mAdView.loadAd(adRequest);
return root;
}
public void tellJoke(){
Intent intent = new Intent(getActivity(), JokeTellerActivity.class);
//TODO: get jokes from Google Cloud endpoint
intent.putExtra(JOKE,
getActivity().getString(R.string.joke)
);
startActivity(intent);
}
}
MyEndPoint.class
public class MyEndpoint {
public static List<Joke> mJokes = new ArrayList<>();
/** 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();
response.setData("Hi, " + name);
return response;
}
}
我已经尝试在几个不同的设备上运行它,但没有一个会连接。
答案 0 :(得分:1)
我遇到了同样的问题,因为我也是从Android Nanodegree(Udacity)做这个项目。
我在this question找到了解决方案。由于答案有点混乱或不完整,我将详细解释我在计算机上运行本地服务器所做的工作,并使用真实的设备对其进行测试。
1)将httpAddress = "0.0.0.0"
添加到后端(Google Cloud Endpoint)模块的appengine
文件中的build.gradle
块,如下所示:
appengine {
...
httpAddress = "0.0.0.0"
}
根据对相关问题的评论,这意味着&#39;将从任何地方接受#。
2)在本地运行后端模块(即启动Web服务器)。这很简单:在下拉菜单中选择后端配置,然后按绿色按钮。你可以find more detailed instructions here。
您现在应该可以打开浏览器(在您的计算机上)并导航到http://localhost:8080/
并查看包含“Hello,Endpoints!&#39;和许多其他的东西。
3)找到您计算机的IP地址(在Mac上转至系统偏好设置 - &gt;网络),然后将其设置为Android应用代码中的根网址,如下所示:
MyApi.Builder builder = new MyApi.Builder(
AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(),
null
).setRootUrl("http://192.168.1.36:8080/_ah/api/")
这就是全部!
答案 1 :(得分:0)
因此,您在运行Android模拟器的同一台计算机上将基于AppEngine的云端点设置为本地开发服务器?确保您使用端点的正确IP地址(和端口)。您需要的本地IP地址不是 Android模拟器使用的地址,而是主机开发者。例如:
本地开发机器:192.168.1.100
开发机器上的AppEngine服务器:收听8080
在开发机器上运行的Android模拟器:10.0.2.2
您也应该可以通过Android模拟器上的浏览器访问开发计算机上的API资源管理器。您可以使用它来检查您的应用是否使用了正确的地址:
http://192.168.1.100:8080/_ah/api/explorer