Android NetworkOnMainThread异常出错

Android NetworkOnMainThread异常出错,android,database,post,Android,Database,Post,我想从我的设备发送到远程数据库,但我有NetworkOnMainThread,除了,我如何解决这个任务?我还需要一个简单的例子,如何发布数据到远程数据库 ib_wyslij.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub

我想从我的设备发送到远程数据库,但我有NetworkOnMainThread,除了,我如何解决这个任务?我还需要一个简单的例子,如何发布数据到远程数据库

ib_wyslij.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                sendAccelerationData(zam);

            }
    });



    private void sendAccelerationData(Zamowienie zam)
    {

        //Add data to be send.
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
        nameValuePairs.add(new BasicNameValuePair("Zam_suma", Float.toString(zam.getSuma())));

        this.sendData(nameValuePairs);
    }

private void sendData(ArrayList<NameValuePair> data){

        try
        {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("www.kupa.pl/1.php");
            httppost.setEntity((HttpEntity) new UrlEncodedFormEntity(data));
            HttpResponse response = httpclient.execute(httppost);
            Log.i("postData", response.getStatusLine().toString());
                //Could do something better with response.
        }
        catch(Exception e)
        {
            Log.e("log_tag", "Error:  "+e.toString());
        }  
    }
ib_wyslij.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
发送加速数据(zam);
}
});
私有void sendAccelerationData(Zamoviene zam)
{
//添加要发送的数据。
ArrayList nameValuePairs=新的ArrayList(1);
添加(新的BasicNameValuePair(“Zam_-suma”,Float.toString(Zam.getSuma())));
此.sendData(nameValuePairs);
}
私有void sendData(ArrayList数据){
尝试
{
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(“www.kupa.pl/1.php”);
setEntity((HttpEntity)新的UrlEncodedFormEntity(数据));
HttpResponse response=httpclient.execute(httppost);
Log.i(“postData”,response.getStatusLine().toString());
//我们可以通过回应做得更好。
}
捕获(例外e)
{
Log.e(“Log_标记”,“错误:+e.toString());
}  
}

例外情况告诉您-错误在于您在主线程上执行网络活动。将它异步地放在后台。在这种情况下,AsyncTask可以完美地工作

  private void sendAccelerationData(final Zamowienie zam) {

      new AsyncTask<Void,Void,Void>() {

          public void doInBackground(...) {

                //Add data to be send.
                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
                nameValuePairs.add(new BasicNameValuePair("Zam_suma", Float.toString(zam.getSuma())));

                MyActivityClass.this.sendData(nameValuePairs);

          }

      }


}
private void sendAccelerationData(最终Zamowienie zam){
新建异步任务(){
公共无效doInBackground(…){
//添加要发送的数据。
ArrayList nameValuePairs=新的ArrayList(1);
添加(新的BasicNameValuePair(“Zam_-suma”,Float.toString(Zam.getSuma())));
MyActivityClass.this.sendData(nameValuePairs);
}
}
}

将其添加到您的
onCreate()中

if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
            }
将此添加到清单中

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


对于网络任务,最好使用线程或异步任务…

您不能在主UI中进行网络操作,因为这会阻碍您的程序执行,给您的用户带来非常恶心的体验。为此,您必须在
线程
中分离网络操作,如果您刚刚开始使用线程世界,则最好是在
异步任务
中分离网络操作

这是您将使用的结构:

final class MyNetworkOperation extends AsyncTask<URL, Integer, Void> {
  @Override
  protected void onPreExecute(final Void param) {
    ...
  }

  @Override
  protected Void doInBackground(final URL... args) {
    ...
    return null;
  }

  @Override
  protected void onPostExecute(final Void param) {
    ...
  }
}
final类MyNetworkOperation扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(最终void参数){
...
}
@凌驾
受保护的Void doInBackground(最终URL…args){
...
返回null;
}
@凌驾
受保护的void onPostExecute(最终void参数){
...
}
}
即使是方法名称也是非常不言自明的。当您定义AsyncTask并对其调用
.execute(url\u对象)
时,第一个调用的方法将是
.onPreExecute()
,在那里您可以初始化变量并为您想要执行的网络操作准备一切。网络操作的困难部分应该在
doInBackground()内部完成。
。在那里连接、传输数据并断开与主机的连接。最后,调用
onPostExecute()
:完成后,您可以在此处处理结果(将其传输到主活动,显示对话框等)

有关异步任务的更多信息(以及了解这些参数的含义),我强烈建议阅读


一个很好的例子可能是这样的。

o.o.。将你的网络内容放在一个单独的线程中……在发布这篇文章之前,你有没有费心搜索例外情况或浏览一些问题?由于缺乏基础研究而被否决……在这个例子中,他展示了如何发送数据!我需要一个例子,他发布数据不重要发送或张贴这根本不回答这个问题。如果他有权限错误,日志会说,不是NetworkOnMainThreadya,我还写了“更好地使用线程或异步任务进行网络任务…”这是一个建议权限的糟糕建议,特别是对于初学者。。。