You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Java登录页:服务器返回Status=Y后跳转Activity问题求助

Android Java登录页跳转问题解决方法

原代码存在的核心问题

  • 字符串比较误用==:Java中字符串内容相等需用equals()/equalsIgnoreCase(),==仅比较对象引用地址。
  • 响应内容处理错误:直接将完整JSON响应与"Y"对比,未解析JSON提取目标字段。
  • 异常逻辑颠倒:将跳转逻辑放在catch块(仅解析失败时执行),正确逻辑应在解析成功的try块中。
  • 静态方法误用:错误调用JSONObject.getString()静态方法,需通过解析后的实例调用。
  • 字段名大小写不匹配:用户标注服务器返回字段为Status,但原代码中用了小写status,这是导致匹配失败的常见原因。

修正后的完整代码

btSubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("app_id", "123456");
            jsonObject.put("username", etUsername.getText().toString());
            jsonObject.put("password", etPassword.getText().toString());
            jsonObject.put("firebase_token", "123456");
        } catch (JSONException e) {
            e.printStackTrace();
        }

        OkHttpClient client = new OkHttpClient();
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(JSON, jsonObject.toString());
        Request request = new Request.Builder()
                .url("your_server_url_here") // 替换为实际接口地址
                .post(body)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                MainActivity.this.runOnUiThread(() -> {
                    TextViewResult.setText("网络请求失败");
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    String myResponse = response.body().string();
                    MainActivity.this.runOnUiThread(() -> {
                        try {
                            JSONObject obj = new JSONObject(myResponse);
                            // 严格匹配服务器返回的字段名:Status(注意大小写)
                            String status = obj.getString("Status");
                            
                            // 调试打印
                            System.out.println("Status: " + status);
                            System.out.println("status_desc: " + obj.getString("status_desc"));
                            System.out.println("token_id: " + obj.getString("token_id"));

                            // 判断Status为Y时跳转
                            if ("Y".equals(status)) {
                                Intent intent = new Intent(MainActivity.this, MainActivity2.class);
                                startActivity(intent);
                            } else {
                                TextViewResult.setText("登录失败:" + obj.getString("status_desc"));
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                            TextViewResult.setText("响应解析失败");
                        }
                    });
                } else {
                    MainActivity.this.runOnUiThread(() -> {
                        TextViewResult.setText("请求失败,状态码:" + response.code());
                    });
                }
            }
        });
    }
});

关键修改说明

  1. 字符串安全比较:用"Y".equals(status)避免空指针异常(若status为null时不会崩溃)。
  2. 修正字段名:严格匹配服务器返回的Status字段大小写,这是最容易忽略的匹配失败原因。
  3. 调整逻辑位置:将跳转逻辑放在try块内,确保JSON解析成功后才执行判断。
  4. 完善错误提示:添加网络失败、请求失败、解析失败的友好提示,方便调试定位问题。

内容的提问来源于stack exchange,提问作者kimhong toh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:45:36