在android中由http客户端http post引起的非法状态异常

时间:2014-02-02 15:09:18

标签: android json http-post httpclient

我正在尝试访问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

任何想法?谢谢!

2 个答案:

答案 0 :(得分: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 - 就像你的情况一样。

答案 1 :(得分:0)

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

每次使用try时,都应该捕获可能发生的特定异常,在您的情况下,您可能正在捕获try语句无意的异常。

有关此here的更多信息。