2013-09-30 49 views
0

我無法將數據發送到我的數據庫。我在另一個類中使用了相同類型的代碼,那些工作正常,但不知何故,這是行不通的。Android - HttpResponse未執行

這是帶有HttpResponse的類。有沒有錯誤,但是當代碼達到

HttpResponse response = httpclient.execute(httppost); 

它進入漁獲物和返回「不添加Klant」)

public void StoreKlantInDatabase() 
{ 

    EditText ETklantnaam = (EditText) dialog.findViewById(R.id.addKlantNaam); 
    EditText ETlocatie = (EditText) dialog.findViewById(R.id.addKlantLocatie); 
    EditText ETfabriek = (EditText) dialog.findViewById(R.id.addFabrieken); 
    EditText ETmachine = (EditText) dialog.findViewById(R.id.addMachines); 

    String klantnaam = ETklantnaam.getText().toString(); 
    String locatie = ETlocatie.getText().toString(); 
    String fabriek = ETfabriek.getText().toString(); 
    String machine= ETmachine.getText().toString(); 


    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(urlInsertKlant); 

    try 
    { 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("klantnaam", klantnaam)); 
     nameValuePairs.add(new BasicNameValuePair("locatie", locatie)); 
     nameValuePairs.add(new BasicNameValuePair("fabriek", fabriek)); 
     nameValuePairs.add(new BasicNameValuePair("machine", machine)); 

     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8)); 
     @SuppressWarnings("unused") 
     HttpResponse response = httpclient.execute(httppost); 

     Toast.makeText(getApplicationContext(), "Klant succesvol toegevoegd", Toast.LENGTH_LONG).show(); 
    } 

    catch(Exception e) 
    { 
     e.printStackTrace(); 
     Toast.makeText(getApplicationContext(), "Klant NIET toegevoegd", Toast.LENGTH_LONG).show(); 
    } 
} 

這種方法是從一個對話框調用,像這樣(打倒在最後OnClick方法):

btnAdd.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      // custom dialog 
      dialog = new Dialog(context); 
      dialog.setContentView(R.layout.addklant_layout); 
      dialog.setTitle("Klant toevoegen"); 

      Button BTNannuleren = (Button) dialog.findViewById(R.id.dialogAnnuleren); 
      // if button is clicked, close the custom dialog 
      BTNannuleren.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        dialog.dismiss(); 
       } 
      }); 

      Button BTNtoevoegen = (Button) dialog.findViewById(R.id.dialogToevoegen); 
      // if button is clicked, close the custom dialog 
      BTNtoevoegen.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
         StoreKlantInDatabase(); 
         dialog.dismiss(); 
        } 
      });  
      dialog.show(); 
     } 
    }); 

我tryed只是做這一切在對話框的onclick方法,但並沒有區別。

Dialog dialog; 

有誰看到我要去哪裏錯了:

Ofcouse對話框在類似代碼的頂部開始?我有點失落。

編輯:這發生在catch:

09-30 09:36:52.452: W/System.err(14665): android.os.NetworkOnMainThreadException 
09-30 09:36:52.482: W/System.err(14665): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1186) 
09-30 09:36:52.482: W/System.err(14665): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
09-30 09:36:52.482: W/System.err(14665): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
09-30 09:36:52.482: W/System.err(14665): at libcore.io.IoBridge.connect(IoBridge.java:112) 
09-30 09:36:52.482: W/System.err(14665): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
09-30 09:36:52.482: W/System.err(14665): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
09-30 09:36:52.482: W/System.err(14665): at java.net.Socket.connect(Socket.java:872) 
09-30 09:36:52.482: W/System.err(14665): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 
09-30 09:36:52.482: W/System.err(14665): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144) 
09-30 09:36:52.482: W/System.err(14665): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
09-30 09:36:52.482: W/System.err(14665): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
09-30 09:36:52.482: W/System.err(14665): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
09-30 09:36:52.482: W/System.err(14665): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:591) 
09-30 09:36:52.482: W/System.err(14665): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:510) 
09-30 09:36:52.482: W/System.err(14665): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:488) 
09-30 09:36:52.482: W/System.err(14665): at com.example.emmtec.FirstScreen.StoreKlantInDatabase(FirstScreen.java:272) 
09-30 09:36:52.482: W/System.err(14665): at com.example.emmtec.FirstScreen$10$2.onClick(FirstScreen.java:236) 
09-30 09:36:52.482: W/System.err(14665): at android.view.View.performClick(View.java:3538) 
09-30 09:36:52.492: W/System.err(14665): at android.view.View$PerformClick.run(View.java:14330) 
09-30 09:36:52.492: W/System.err(14665): at android.os.Handler.handleCallback(Handler.java:608) 
09-30 09:36:52.492: W/System.err(14665): at android.os.Handler.dispatchMessage(Handler.java:92) 
09-30 09:36:52.492: W/System.err(14665): at android.os.Looper.loop(Looper.java:156) 
09-30 09:36:52.492: W/System.err(14665): at android.app.ActivityThread.main(ActivityThread.java:4977) 
09-30 09:36:52.492: W/System.err(14665): at java.lang.reflect.Method.invokeNative(Native Method) 
09-30 09:36:52.492: W/System.err(14665): at java.lang.reflect.Method.invoke(Method.java:511) 
09-30 09:36:52.492: W/System.err(14665): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
09-30 09:36:52.492: W/System.err(14665): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
09-30 09:36:52.492: W/System.err(14665): at dalvik.system.NativeStart.main(Native Method) 

提前感謝!

+0

它抓住拋出什麼異常? –

+0

抱歉,忘了添加到帖子,我現在更新帖子! – GeertG

回答

1

9月9日至三十○日:36:52.452:W /System.err(14665):android.os.NetworkOnMainThreadException

你做它不是由Android版本支持在主線程網絡請求你」重新使用。

您可以使用AsyncTask使用UI線程發出任何網絡請求。 Android開發者頁面提供了一個很好的例子來說明如何使用它。

現在爲什麼要使用AsyncTask? 假設我們正在通過點擊應用程序中的按鈕來進行網絡操作。在按鈕上單擊將向服務器發出請求,並等待響應。由於android的單線程模型,直到等待時間響應,我們的屏幕無響應。所以我們應該避免在UI線程上執行長時間運行的操作。這包括文件和網絡訪問。

您需要在您的活動中創建一個私有類。然後在你的按鈕點擊偵聽器中創建一個AsyncTask類的對象並執行。

BTNtoevoegen.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        asyncTask task = new asyncTask(); 
        task.execute(url1); 
       } 
     }); 

您可能還想在發出網絡請求時顯示ProgressDialogs。你可以在onPreExecute()和onPostExecuteMethod()中處理它。

你可以看看這裏的實現:
https://github.com/vshivam/privly-android/blob/master/src/ly/priv/mobile/Login.java#L184

+0

謝謝,這回答我所有的問題! progressDialog也是一個好主意,還沒有做過這方面的工作(直到現在用戶只需等待一會兒,而屏幕凍結)。 – GeertG

2

Android不支持在主/輔助線程上對HoneyComb及更高版本進行網絡操作。因此,在其他線程然後主線程上執行網絡操作。

AsyncTask是一個很好的選擇。

+0

感謝您的回覆,我也讀過其他地方。但....在同一個項目中的其他類我正在這樣做:按下按鈕 - 彈出窗口詢問用戶是肯定 - 調用方法sendform()發送代碼完全一樣的方式,因爲我現在正在嘗試(複製代碼並更改輸入字段)。所以我不明白爲什麼這些工作和上述問題沒有。你明白我的意思嗎?:p – GeertG

2

使用的AsyncTask做網絡運營...

另一個解決辦法是添加以下行代碼中的上述網絡運行代碼

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

謝謝你的回答,它已經進入了捕捉狀態。現在,我出於好奇而得到了這個問題:爲什麼我應該盡全力做出一個新的AsyncTask,只要這2條簡單線路解決了這個問題? – GeertG

+0

通過這個http://developer.android.com/reference/android/os/StrictMode.ThreadPolicy.Builder.html – Vamshi

+0

@GeertG我認爲這是不好的做法。它不是解決方案。 –