java.lang.IllegalStateException 使用 HttpResponse 发送 JSON 到网络服务时

java.lang.IllegalStateException when sending JSON to webservice using HttpResponse

我正在尝试将 JSON 数据对象传递到我的 Android 应用程序中的网络服务。我有一个按钮,当我点击它时,我想将位置发送到我的网络服务。一切正常,直到最后一个命令。我从另一个 post 那里得到了我的代码: How to post data to a Webservice using JSON?

它应该可以工作,所以我认为问题出在其他地方,但错误对我来说没有任何意义。这是我在 onclick 上运行的函数:

public void clickbuttonRecieve(View v) {
         new MyAsync().execute();
 }


 private class MyAsync extends AsyncTask<Void, Void, Void> {
        protected Void doInBackground(Void... tmps) {
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(
                    "http://bomatec.be/webservice2.php");

            httpPost.setHeader("content-type", "application/json");
            JSONObject data = new JSONObject();
            try {
                String message;

                data.put("user", "12");
                data.put("lat", "50.8");
                data.put("lng", "4.3");


            }catch (JSONException e) {
                Log.e("MYAPP", "unexpected JSON exception", e);
            }

            try {
                StringEntity entity = new StringEntity(data.toString(), HTTP.UTF_8);
                httpPost.setEntity(entity);
            }catch(java.io.UnsupportedEncodingException e){
                Log.e("MYAPP", "UnsupportedEncodingException JSON exception", e);
            }


            try {
                HttpResponse response = httpClient.execute(httpPost);
            }catch (IOException e){
                Log.e("MYAPP", "IOException", e);
            }
            return null;
        }
    }

错误堆栈:

 java.lang.RuntimeException: An error occured while executing doInBackground()
                                                                                                    at android.os.AsyncTask.done(AsyncTask.java:299)
                                                                                                    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
                                                                                                    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
                                                                                                    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
                                                                                                    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
                                                                                                    at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:230)
                                                                                                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
                                                                                                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
                                                                                                    at java.lang.Thread.run(Thread.java:856)
                                                                                                 Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
                                                                                                    at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
                                                                                                    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
                                                                                                    at java.net.InetAddress.getAllByName(InetAddress.java:214)
                                                                                                    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
                                                                                                    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
                                                                                                    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
                                                                                                    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
                                                                                                    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
                                                                                                    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
                                                                                                    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
                                                                                                    at com.example.stevengerrits.bomatec_gerrits_steven.MainActivity$MyAsync.doInBackground(MainActivity.java:177)
                                                                                                    at com.example.stevengerrits.bomatec_gerrits_steven.MainActivity$MyAsync.doInBackground(MainActivity.java:148)
                                                                                                    at android.os.AsyncTask.call(AsyncTask.java:287)
                                                                                                    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
                                                                                                    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
                                                                                                    at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:230) 
                                                                                                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
                                                                                                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
                                                                                                    at java.lang.Thread.run(Thread.java:856) 
                                                                                                 Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
                                                                                                    at libcore.io.Posix.getaddrinfo(Native Method)
                                                                                                    at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
                                                                                                    at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
                                                                                                    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
                                                                                                    at java.net.InetAddress.getAllByName(InetAddress.java:214) 
                                                                                                    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
                                                                                                    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
                                                                                                    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
                                                                                                    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
                                                                                                    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
                                                                                                    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
                                                                                                    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
                                                                                                    at com.example.stevengerrits.bomatec_gerrits_steven.MainActivity$MyAsync.doInBackground(MainActivity.java:177) 
                                                                                                    at com.example.stevengerrits.bomatec_gerrits_steven.MainActivity$MyAsync.doInBackground(MainActivity.java:148) 
                                                                                                    at android.os.AsyncTask.call(AsyncTask.java:287) 
                                                                                                    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
                                                                                                    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
                                                                                                    at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:230) 
                                                                                                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
                                                                                                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
                                                                                                    at java.lang.Thread.run(Thread.java:856) 
                                                                                                 Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
                                                                                                    at libcore.io.Posix.getaddrinfo(Native Method) 
                                                                                                    at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55) 
                                                                                                    at java.net.InetAddress.lookupHostByName(InetAddress.java:405) 
                                                                                                    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
                                                                                                    at java.net.InetAddress.getAllByName(InetAddress.java:214) 
                                                                                                    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
                                                                                                    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
                                                                                                    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
                                                                                                    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
                                                                                                    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
                                                                                                    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
                                                                                                    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
                                                                                                    at com.example.stevengerrits.bomatec_gerrits_steven.MainActivity$MyAsync.doInBackground(MainActivity.java:177) 
                                                                                                    at com.example.stevengerrits.bomatec_gerrits_steven.MainActivity$MyAsync.doInBackground(MainActivity.java:148) 
                                                                                                    at android.os.AsyncTask.call(AsyncTask.java:287) 
                                                                                                    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
                                                                                                    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
                                                                                                    at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:230) 
                                                                                                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
                                                                                                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
                                                                                                    at java.lang.Thread.run(Thread.java:856) 

您有 NetworkOnMainThreadException 异常,您必须将您的 onClick 代码放入 AsyncTask 中。 Android 禁止在 UI 线程上进行网络操作,这是为了防止阻塞主 UI 消息队列。

示例代码为:

 private class MyAsync extends AsyncTask<Void, Void, Void> {
     protected Void doInBackground(Void... tmps) {
         // do your work here!!
         return null;
     }
 }

在您的 onclick 中 - 执行:new MyAsync().execute()