POST请求无法在线程Android上运行

时间:2017-05-08 10:46:18

标签: android json multithreading post

我在Android应用程序中遇到了一个奇怪的错误,我想做一个POST请求来将数据存储在MySQL数据库中。

但问题是当我尝试在一个线程中执行此操作时应用程序终止并且错误中没有任何指示,因此很难修复它。

代码如下:

   thread =  new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
                        URL url = new URL("myurl");
                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                        connection.setDoOutput(true);
                        connection.setRequestMethod("POST");
                        connection.setRequestProperty("Content-type","application/json");

                        JSONObject jsobj = new JSONObject();
                        jsobj.put("pseudo",edit.getText().toString());
                        jsobj.put("score",score);

                        DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
                        wr.writeBytes(jsobj.toString());
                        wr.flush();
                        wr.close();

                    } catch (IOException e) {
                        e.printStackTrace();
                    }catch (JSONException je){
                        je.printStackTrace();
                    }
                }
            });
            thread.start();

thread = new Thread(new Runnable() { @Override public void run() { try { android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); URL url = new URL("myurl"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-type","application/json"); JSONObject jsobj = new JSONObject(); jsobj.put("pseudo",edit.getText().toString()); jsobj.put("score",score); DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); wr.writeBytes(jsobj.toString()); wr.flush(); wr.close(); } catch (IOException e) { e.printStackTrace(); }catch (JSONException je){ je.printStackTrace(); } } }); thread.start();

非常感谢你帮助我:)。

2 个答案:

答案 0 :(得分:0)

首先,对于此类用例,我建议您使用AsyncTask 这是一个简单的请求,AsyncTasks更易于使用。

其次,您只是将请求发送到服务器,但没有获得响应,因此如果请求在服务器端失败或您提出错误请求,您将不会意识到它。您可以使用okhttp来简化流程。

答案 1 :(得分:0)

在setContentView();

之前添加此行
 StrictMode.ThreadPolicy policy = new 
 StrictMode.ThreadPolicy.Builder().permitAll().build();
 StrictMode.setThreadPolicy(policy);
 setContentView();