2017-05-08 17 views
-1

我在我的android应用程序中想出了一个奇怪的错误,我想要做一个POST请求来将数据存储在MySQL数据库中。POST请求不能在线程上运行Android

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

的代码波纹管:

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(); 

非常感谢你的帮助,你会得到我:)。

+0

把你的错误日志这里 –

+0

看来,我需要在设备上的互联网连接,所以我要告诉他需要互联网 –

+0

当然的应用程序,您需要互联网许可。 –

回答

0

试试这个

public class CallWebService extends AsyncTask<String,String,String>{ 

     String pseudo =""; 
     String score=""; 
     public CallWebService(String pseudo,String score){ 
      this.pseudo = pseudo; 
      this.score = score; 
     } 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 

     @Override 
     protected String doInBackground(String... params) { 
      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",pseudo); 
       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(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
     } 
    } 

,并添加下面的代码执行上面的AsyncTask

`new CallWebService(edt.getText().toString(),score).execute();` 
+0

废话。你不看到OP使用线程了吗? – greenapps

0

首先,对于这种使用情况下,我建议你使用AsyncTask因为 这是一个简单的请求和AsyncTasks更容易使用。

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

+0

这完全没有答案。请使用意见的建议。 – greenapps

0

在setContentView()之前添加此行;

StrictMode.ThreadPolicy policy = new 
StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
setContentView(); 
+0

非常糟糕的建议。并不需要使用线程。 – greenapps

0

谢谢你们,我已经找到了问题的答案,我们需要增加网络权限的程序的工作。因此,我们必须对你的清单中添加Internet权限是这样的:

<uses-permission android:name="android.permission.INTERNET"/>