我正在同时开发Android Studio前端和Springboot后端。
让 Springboot 作为本地主机运行,
我正在通过连接到 Android studio 在物理智能手机设备上构建和运行,但我不知道如何将它们连接到 REST API。
我写的前端代码如下,
与本地服务器连接不良是否会出现`com.android.volley.TimeoutError`错误。
我想请教您如何正确地做这件事的建议。
Url的192.168.56.1是我的ipv4地址,在Windows终端中输入ipconfig后出现。
谢谢你。
public class JoinActivity extends AppCompatActivity {
private EditText editText_email;
private TextView text_message;
RequestQueue queue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_join);
editText_email = findViewById(R.id.editText_email);
Button btn_dupCheck = findViewById(R.id.btn_dupCheck);
text_message = findViewById(R.id.text_message);
queue = Volley.newRequestQueue(this);
String url="http://192.168.56.1:8080/user/check-email";
btn_dupCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
JSONObject jsonRequest = new JSONObject();
try {
jsonRequest.put("email", editText_email.getText().toString());
Log.d("success", editText_email.getText().toString());
} catch (JSONException e) {
e.printStackTrace();
}
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, jsonRequest, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("success", response.toString());
try {
boolean isSuccess = response.getBoolean("isSuccess");
if (isSuccess) {
JSONObject result = response.getJSONObject("result");
boolean emailExists = result.getBoolean("emailExists");
if (emailExists) {
text_message.setTextColor(getResources().getColor(R.color.red));
text_message.setText("dup email");
} else {
text_message.setTextColor(getResources().getColor(R.color.green));
text_message.setText("available email");
}
} else {
Toast.makeText(JoinActivity.this, "server res error", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(JoinActivity.this, "JSON parsing error", Toast.LENGTH_SHORT).show();
}
// Intent intent = new Intent(getApplicationContext(), MainActivity.class);
// startActivity(intent);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("error", error.toString());
if (error.networkResponse != null && error.networkResponse.data != null) {
try {
String errorResponse = new String(error.networkResponse.data, "utf-8");
JSONObject jsonObject = new JSONObject(errorResponse);
String errorMessage = jsonObject.getString("errorMessage");
// Handle BaseException
Log.d("test", "BaseException: " + errorMessage);
} catch (UnsupportedEncodingException | JSONException e) {
e.printStackTrace();
}
}
}
});
request.setShouldCache(false);
request.setRetryPolicy(new DefaultRetryPolicy(100000000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
queue.add(request);
}
});
}
}
我想让它在物理设备上运行良好,即使我在本地服务器上运行它。
本地服务器的问题 - 可能是网络本身的问题。如果您在物理设备上进行测试,请确保它们位于同一 wifi 网络上,并确保您的路由器设置为允许同一 wifi 网络上的其他设备向该端口和计算机发送流量(默认情况下,这通常会被阻止)在商业路由器上)。如果在同一台机器上的模拟器上进行测试,请改用 10.0.2.2,这是 Android 模拟器映射到主机的 IP。
请注意,它根本无法在物理设备上工作,除非您有一个公共可路由的 IP 地址(这基本上意味着将其托管在云中或运行您自己的数据中心)或位于同一 wifi 网络上。如果在蜂窝网络上,它永远无法在本地托管服务器上工作,因为蜂窝网络将无法找到您的 IP(192.168.56.x 不是真实的 IP,只能从同一网络访问)。