【问题标题】:Illegal state exception caused by http client http post in androidandroid中http客户端http post引发的非法状态异常
【发布时间】:2014-02-02 15:09:17
【问题描述】:

我正在尝试访问 Web API 服务器并将 json 对象传递给它。问题是,我总是遇到这个异常。我真的不知道我的代码有什么问题。这里是:

    String email = EmailAddress.getText().toString();
    String password = Password.getText().toString();
    String url = "SOME URL";

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost(url);
    JSONObject loginObj = new JSONObject();

    try
    {
        loginObj.put("Username", email);
        loginObj.put("Password", password);

        // Prepare JSON to send by setting the entity
        httpPost.setEntity(new StringEntity(loginObj.toString(), "UTF-8"));

        // Set up the header types needed to properly transfer JSON
        httpPost.setHeader("Content-Type", "application/json");
        httpPost.setHeader("Accept-Encoding", "application/json");
        httpPost.setHeader("Accept-Language", "en-US");

        // Execute POST
        HttpResponse response = httpClient.execute(httpPost);

        Log.i("Response String", response.getEntity().toString());
    }
    catch(Exception e)
    {
        Log.e("Exception", e.getMessage().toString());
    }

这是我的日志:

02-02 23:06:37.080: E/AndroidRuntime(26513): FATAL EXCEPTION: main
02-02 23:06:37.080: E/AndroidRuntime(26513): java.lang.IllegalStateException: Could not execute method of the activity
02-02 23:06:37.080: E/AndroidRuntime(26513):    at android.view.View$1.onClick(View.java:3691)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at android.view.View.performClick(View.java:4211)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at android.view.View$PerformClick.run(View.java:17267)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at android.os.Handler.handleCallback(Handler.java:615)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at android.os.Looper.loop(Looper.java:137)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at android.app.ActivityThread.main(ActivityThread.java:4898)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at java.lang.reflect.Method.invokeNative(Native Method)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at java.lang.reflect.Method.invoke(Method.java:511)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at dalvik.system.NativeStart.main(Native Method)
02-02 23:06:37.080: E/AndroidRuntime(26513): Caused by: java.lang.reflect.InvocationTargetException
02-02 23:06:37.080: E/AndroidRuntime(26513):    at java.lang.reflect.Method.invokeNative(Native Method)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at java.lang.reflect.Method.invoke(Method.java:511)
02-02 23:06:37.080: E/AndroidRuntime(26513):    at android.view.View$1.onClick(View.java:3686)
02-02 23:06:37.080: E/AndroidRuntime(26513):    ... 11 more
02-02 23:06:37.080: E/AndroidRuntime(26513): Caused by: java.lang.NullPointerException
02-02 23:06:37.080: E/AndroidRuntime(26513):    at com.example.maddiosapp.Login.userLogin(Login.java:81)
02-02 23:06:37.080: E/AndroidRuntime(26513):    ... 14 more

有什么想法吗?谢谢!

【问题讨论】:

  • Login.java 文件的第 81 行是什么?
  • Log.e("异常", e.getMessage().toString()); -- 这个
  • 我把这个改成了吐司。现在它可以工作了。但我不知道是什么导致了异常。我希望我能用 e.getMessage() 得到它。有什么想法吗?

标签: android json http-post httpclient


【解决方案1】:

看起来您正在 UI 线程上执行网络操作,而您的 try catch 块正在捕获 android.os.NetworkOnMainThreadException。至少这看起来像是来自您的调用堆栈的可能代码,而且您在执行网络请求的同一函数中获取密码/用户名,您应该在 UI 线程上获取这些值。

你可以在这里看到:

http://androidxref.com/4.4.2_r1/xref/frameworks/base/core/java/android/os/StrictMode.java#1145

创建 NetworkOnMainThreadException 时未提供任何消息,因此当您调用 getMessage().toString() 时,getMessage() 返回 null,从而导致 NullPointerException - 就像您的情况一样。

【讨论】:

  • 我认为有一种方法可以允许在主线程上进行网络操作。我打算在这里使用一些装载机。我认为这与严格模式有关。有什么想法吗?
  • 你最好切换到 AsyncTask 解决方案,因为 3.0(左右)对于在 UI 线程上完成的网络操作总是抛出这个异常:androiddesignpatterns.com/2012/06/…
【解决方案2】:

Log.e("Exception", e.getMessage().toString()); 是抛出异常的行。原因很简单:捕获通用异常(在大多数情况下)是一种不好的做法,应该避免。

每次使用 try 时,您都应该捕获可能发生的特定异常,在您的情况下,您可能会捕获到 try 语句未预期的异常。

有关此here 的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2013-01-13
    • 2017-11-28
    相关资源
    最近更新 更多