android中http客户端http post导致的非法状态异常

android中http客户端http post导致的非法状态异常,android,json,http-post,httpclient,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 DefaultHttpCl

我正在尝试访问一个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
有什么想法吗?谢谢

Log.e(“异常”,例如getMessage().toString())是引发异常的行。原因很简单:捕获一般异常(在大多数情况下)是一种不好的做法,应该避免

每次使用
try
时,您应该捕获可能发生的特定异常,在您的情况下,您可能捕获的异常不是您的
try
语句想要的


更多信息。

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

你可以在这里看到:


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

Login.java文件的第81行是什么?Log.e(“Exception”,e.getMessage().toString());--我把这个换成了祝酒词。现在它开始工作了。但我不知道是什么导致了异常。我希望我可以通过e.getMessage()获得它。有什么想法吗?我认为有一种方法可以允许在主线程上进行网络操作。我打算在这里用一些装载机。我认为这与严格模式有关。有什么想法吗?您最好切换到AsyncTask解决方案,因为对于在UI线程上执行的网络操作,3.0(或更高版本)总是会引发此异常: