如何在物理智能手机上作为本地服务器运行

问题描述 投票:0回答:1

我正在同时开发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);
            }
        });
    }
}

我想让它在物理设备上运行良好,即使我在本地服务器上运行它。

android spring-boot android-volley
1个回答
0
投票

本地服务器的问题 - 可能是网络本身的问题。如果您在物理设备上进行测试,请确保它们位于同一 wifi 网络上,并确保您的路由器设置为允许同一 wifi 网络上的其他设备向该端口和计算机发送流量(默认情况下,这通常会被阻止)在商业路由器上)。如果在同一台机器上的模拟器上进行测试,请改用 10.0.2.2,这是 Android 模拟器映射到主机的 IP。

请注意,它根本无法在物理设备上工作,除非您有一个公共可路由的 IP 地址(这基本上意味着将其托管在云中或运行您自己的数据中心)或位于同一 wifi 网络上。如果在蜂窝网络上,它永远无法在本地托管服务器上工作,因为蜂窝网络将无法找到您的 IP(192.168.56.x 不是真实的 IP,只能从同一网络访问)。

© www.soinside.com 2019 - 2024. All rights reserved.