【问题标题】:Android Application works correctly on emulator but crashes on real deviceAndroid 应用程序在模拟器上正常工作,但在真实设备上崩溃
【发布时间】:2015-12-06 16:46:05
【问题描述】:

我正在开发一个使用 MySQL 数据库和 json 的 android 应用程序,它可以在模拟器上正常运行,但是当我在我的设备 (Galaxy S5) 上启动它时,我面临强制关闭 这是我对服务器和获取 json 对象的请求:

    btnFaalSazi.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            String validatePhoneNumber = phoneNumber.getText().toString();
            if (validatePhoneNumber.matches("^(?:0\\d{10}|9\\d{9})$")) {

                txtError.setText("");
                structUsers.register_number = phoneNumber.getText().toString();
                String phone = structUsers.register_number;

                Log.i("LOG", phone);
                Log.i("LOG", "HELOOOOOO");

                final ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("register_number", phone));

                String result = Webservice.readUrl("http://192.168.10.110:2233/api/register", params);

                if (result != null) {
                    try {
                        G.users.clear();
                        JSONObject object = new JSONObject(result);
                        String status = object.optString("status");
                        String code = object.optString("code");
                        String message = object.optString("message");

                        Log.i("LOG", "status hast " + status);
                        Log.i("LOG", "code hast  " + code);
                        Log.i("LOG", "mesage hast  " + message);

                        if (status != null && code != null) {
                            if (Integer.parseInt(status) == -1) {
                                Intent intent = new Intent(ActivityRegisterNumber.this, ActivityRegisterCode.class);
                                intent.putExtra("REGISTERNUMBER", structUsers.register_number);
                                ActivityRegisterNumber.this.startActivity(intent);
                            }
                        }

                        if (status != null && message != null) {
                            if (Integer.parseInt(status) == 100) {
                                Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
                                Log.i("LOG", "after error 100");
                            } else if (Integer.parseInt(status) == 101) {
                                Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
                                Log.i("LOG", "after error 101");
                            } else if (Integer.parseInt(status) == 102) {
                                Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
                                Log.i("LOG", "after error 102");
                            } else if (Integer.parseInt(status) == 103) {
                                Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
                                Log.i("LOG", "after error 103");
                            }
                        }
                    }
                    catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            } else {
                txtError.setText("Wrong phone number");
            }

        }
    });

我认为应用程序在执行此行时会崩溃:

                    String result = Webservice.readUrl("http://192.168.10.110:2233/api/register", params);

这是我的网络服务模块:

public class Webservice {

public static String readUrl(String url, ArrayList<NameValuePair> params) {

    try {

        HttpClient client = new DefaultHttpClient();
        HttpPost method = new HttpPost(url);

        if (params != null) {
            method.setEntity(new UrlEncodedFormEntity(params));
        }

        HttpResponse response = client.execute(method);

        InputStream inputStream = response.getEntity().getContent();
        String result = convertInputStreamToString(inputStream);

        return result;
    }
    catch (ClientProtocolException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}


public static String convertInputStreamToString(InputStream inputStream) {
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder builder = new StringBuilder();

        String line = "";

        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }

        return builder.toString();
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}
}

【问题讨论】:

  • 您是否在清单上设置了所需的权限?尝试在通过 USB 数据线连接到计算机的手机上运行该应用,然后复制 logcat 错误并将其放入您的问题中,以便我们为您提供帮助。
  • 不要在主 UI 线程上进行网络 I/O。请参阅 logcat 以了解 NetworkOnMainThreadException 或任何其他问题。
  • 应用程序因堆栈跟踪而崩溃。它在哪里?
  • 也许是个愚蠢的问题,但您的真实设备是否与模拟器在同一网络上。真实设备甚至可以访问该地址吗?
  • 你在主线程上做网络操作,所以主要原因在那里

标签: java android web-services emulation device


【解决方案1】:

排队

                 String result = Webservice.readUrl("http://192.168.10.110:2233/api/register", params);

您必须为您的设备(手机)获取 ipconfig,不要为您的 emu 使用相同的 ip 配置

【讨论】:

    【解决方案2】:

    我找到了答案,所以我会为以后阅读这篇文章的人解释一下,

    在android 3之后,我们应该使用Asynctask从webservice发送和接收。

    我的模拟器是 android 2.2,我的设备是 android 4.4,所以应用程序在模拟器上运行良好,但在设备中崩溃。

    【讨论】:

      【解决方案3】:

      您的网络服务的网址在您的机器上是本地的。 模拟器工作正常,因为它可能在同一个网络上。

      但您的设备无法访问此网址:http://192.168.10.110:2233/。 这就是为什么它会出现一些超时错误并且您的应用程序崩溃的原因。

      如果您想在您的设备上进行测试,可能需要使用公共网络或使用 wifi 和一些代理工具,例如 Charles

      希望您现在清楚这个问题。

      【讨论】:

      • 感谢您的回答,但我的设备和我的虚拟服务器在同一个网络和相同的 IP 范围内,您有其他想法吗?
      【解决方案4】:

      您是否为您的应用程序授予权限?某些安全软件会阻止您的应用程序访问网络。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 2013-11-24
        • 1970-01-01
        • 2022-10-02
        • 2022-01-17
        • 2015-07-26
        相关资源
        最近更新 更多