0

我无法将数据发送到我的数据库。我在另一个类中使用相同类型的代码并且工作正常,但不知何故这不起作用。

这是具有 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();
      }
    }); 

我试图在对话框的 onClick 方法中完成这一切,但这没有任何区别。

Ofcouse对话框是在代码顶部启动的,例如:

Dialog dialog;

有谁知道我哪里出错了?我有点失落。

编辑:这发生在捕获中:

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)

提前致谢!

4

3 回答 3

2

Android 不支持对 HoneyComb 和更高版本的主/工作线程上的网络操作。所以在其他线程上执行网络操作然后是主线程。

AsyncTask是执行此操作的好选择。

于 2013-09-30T07:51:18.203 回答
2

使用 AsyncTask 做网络操作...

另一个解决方案是在您的网络操作代码上方的代码中添加以下行

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 
于 2013-09-30T07:58:39.847 回答
1

09-30 09:36:52.452: W/System.err(14665): android.os.NetworkOnMainThreadException

您正在使用的 Android 版本不支持的主线程上执行网络请求。

您可以使用AsyncTask通过 UI 线程发出任何网络请求。Android 开发者页面提供了一个很好的例子来说明如何使用它。

现在为什么要使用 AsyncTask ?假设我们在应用程序中单击按钮进行网络操作。单击按钮时,将向服务器发出请求并等待响应。由于 android 的单线程模型,在等待时间响应之前,我们的屏幕是无响应的。所以我们应该避免在 UI 线程上执行长时间运行的操作。这包括文件和网络访问。

您需要在 Activity 中创建一个私有类。然后在按钮单击侦听器中创建 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

于 2013-09-30T08:12:52.387 回答