2017-06-15 57 views
0

我尝试使用HTTP POST将数据传递到服务器时遇到问题。我想将这些数据插入到数据库中。但是,当我测试它时,错误显示为“不幸的是,......已停止”。Android URL和HTTP Post Error

TestActivity.java

public class TestActivity extends AppCompatActivity { 
    ArrayList<Cart> cartList; 
    String URL_SEND; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test); 
     cartList = new ArrayList<>(); 
     URL_SEND = "http://192.168.56.1/api.php"; 
     new SendOrder().execute(); 
    } 

    class SendOrder extends AsyncTask<Void,Void,Void> { 
     @Override 
     protected Void doInBackground(Void... params) { 
      Cart cart1 = new Cart("1", 3); 
      cartList.add(cart1); 
      Cart cart2 = new Cart("2", 2); 
      cartList.add(cart2); 
      try { 
       URL url = new URL(URL_SEND); 
       HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection(); 
       httpURLConnection.setDoOutput(true); 
       httpURLConnection.setRequestMethod("POST"); 
       httpURLConnection.setRequestProperty("Content-Type", "application/json"); 
       httpURLConnection.connect(); 

       JSONObject jsonObject = new JSONObject(); 
       jsonObject.put("idUser", "1"); 
       jsonObject.put("total", 50000); 
       jsonObject.put("cartArray", new JSONArray(cartList)); 
       jsonObject.put("key", "12345"); 

       OutputStreamWriter writer = new OutputStreamWriter(httpURLConnection.getOutputStream()); 
       writer.write(jsonObject.toString()); 
       writer.flush(); 
       Toast.makeText(TestActivity.this, "Order success", Toast.LENGTH_LONG).show(); 
       cartList.clear(); 
      } catch (Exception e) { 
       Toast.makeText(TestActivity.this, "Server error", Toast.LENGTH_LONG).show(); 
      } 

      return null; 
     } 
    } 
} 

Cart.java

public class Cart { 
    private String idMenu; 
    private int quantity = 0; 

    public Cart() { 

    } 

    public Cart(String idMenu, int quantity){ 
     this.idMenu = idMenu; 
     this.quantity = quantity; 
    } 

    public String getIdMenu(){ 
     return idMenu; 
    } 

    public void setIdMenu(String idMenu) { 
     this.idMenu = idMenu; 
    } 

    public int getQuantity() { 
     return quantity; 
    } 

    public void setQuantity(int quantity) { 
     this.quantity = quantity; 
    } 
} 

api.php

<?php 
if ($_SERVER['REQUEST_METHOD']=='POST'){ 
    include_once('../admin/connect_database.php'); 
    $user_id = $_POST['idUser']; 
    $cartArray = $_POST['cartArray']; 
    $key = $_POST['key']; 
    $total= $_POST['total']; 
    $status = "PENDING"; 

    if ($key == $keyapi) { 
     $sth = $dbh->prepare("INSERT INTO order(user_id, total, status_order, time) 
      VALUES(:idUser, :total, :status, :waktu)"); 
     $res = $sth->execute(array(
      'idUser' => $user_id, 
      'total' => $total, 
      'status' => $status, 
      'waktu' => date() 
     )); 
     $id = $dbh->lastInsertId(); 
     foreach ($cartArray as $cart) { 
      $idProduct = $cart->idMenu; 
      $qty = $cart->quantity; 
      $sth = $dbh->prepare('INSERT INTO order_detail(id_order, id_product, qty) VALUES (:idOrder, :idProduct, :qty)'); 
      $res = $sth->execute(array(
       'idOrder' => $id, 
       'idProduct' => $idProduct, 
       'qty' => $qty 
      )); 
     } 
    } 
} 

?> 

好像本身有问题的URL。当我只运行URL url = new URL(URL_SEND);时,发生了同样的错误。我不知道为什么这个代码不起作用。

编辑

这是我得到的错误。

FATAL EXCEPTION: AsyncTask #1 
Process: com.catering.catering, PID: 5219 
java.lang.RuntimeException: An error occurred while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:309) 
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
    at android.os.Handler.<init>(Handler.java:200) 
    at android.os.Handler.<init>(Handler.java:114) 
    at android.widget.Toast$TN.<init>(Toast.java:345) 
    at android.widget.Toast.<init>(Toast.java:101) 
    at android.widget.Toast.makeText(Toast.java:259) 
    at com.catering.catering.TestActivity$SendOrder.doInBackground(TestActivity.java:90) 
    at com.catering.catering.TestActivity$SendOrder.doInBackground(TestActivity.java:57) 
    at android.os.AsyncTask$2.call(AsyncTask.java:295) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
    at java.lang.Thread.run(Thread.java:818)  
+0

post logcat .... –

+0

使用Log.e?我找不到在哪里查看logcat的结果。我正在使用Genymotion。 – david

+0

点击Android工作室下面的Android监视器。有logcat打印。 –

回答

1

你不应该在后台线程做UI的东西。删除doInBackground()中Toast的显示。如果你想确定POST是否成功,我建议在你的实现中返回一个布尔对象。

public class SendOrder extends AsyncTask<Void,Void,Boolean> { 

      @Override 
      public void onPostExecute(Boolean result) { 

       if(result != null && result) { 

        Toast.makeText(TestActivity.this, "Order success", Toast.LENGTH_LONG).show(); 
       } 
       else { 
        Toast.makeText(TestActivity.this, "Order error", Toast.LENGTH_LONG).show(); 
       } 
      } 


      @Override 
      protected Boolean doInBackground(Void... params) { 
       Cart cart1 = new Cart("1", 3); 
       cartList.add(cart1); 
       Cart cart2 = new Cart("2", 2); 
       cartList.add(cart2); 
       try { 
        URL url = new URL(URL_SEND); 
        HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection(); 
        httpURLConnection.setDoOutput(true); 
        httpURLConnection.setRequestMethod("POST"); 
        httpURLConnection.setRequestProperty("Content-Type", "application/json"); 
        httpURLConnection.connect(); 

        JSONObject jsonObject = new JSONObject(); 
        jsonObject.put("idUser", "1"); 
        jsonObject.put("total", 50000); 
        jsonObject.put("cartArray", new JSONArray(cartList)); 
        jsonObject.put("key", "12345"); 

        OutputStreamWriter writer = new OutputStreamWriter(httpURLConnection.getOutputStream()); 
        writer.write(jsonObject.toString()); 
        writer.flush(); 

        cartList.clear(); 

        return true; 
       } catch (Exception e) { 
        // Your code to Log the error 

        return false; 
       } 


      } 
     } 
} 
+0

此代码有效。谢谢。这个答案显示POST表单是否工作。 – david

1

拆除doInBackground这些线():

Toast.makeText(TestActivity.this, "Order success", Toast.LENGTH_LONG).show(); 

Toast.makeText(TestActivity.this, "Server error", Toast.LENGTH_LONG).show(); 

你不能做UI工作doInBackground(): 你敬酒在onPostExecute数据():

看到这个链接:https://stackoverflow.com/a/18948837/6756514

+0

谢谢。有效。但是,如何显示第二个Toast(即在catch块中)。在相同的onPostExecute()? – david

+0

将AsyncTask 更改为AsyncTask 并使用返回文本;从onbackground。现在在postExecute你得到结果文本 –

+0

我明白了。这里还有一个答案。 – david