2014-02-10 4 views
-3

Я хочу сделать сообщение на удаленный db с моего устройства, но у меня есть NetworkOnMainThread, за исключением того, как я могу решить эту задачу? Также мне нужен простой пример, как отправлять данные на удаленный db.Ошибка с исключением 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()); 
     } 
    } 
+0

o.o..до вашего сетевого материала в отдельном потоке .... – Ranjit

+3

Вы даже побеспокоились об исключении Google или просмотрели несколько вопросов на SO, прежде чем публиковать это? Проголосовали за отсутствие фундаментальных исследований ... – 2Dee

+0

В этом примере он показывает, как отправлять данные! Мне нужен пример, где он POST-данных – user2061352

ответ

2

Поскольку исключение говорит вам - что не так, вы делаете сетевую активность в основном потоке. Положите его на задний план асинхронно. В этом случае 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); 

      } 

     } 


} 
-3

Добавить это в onCreate()

if (android.os.Build.VERSION.SDK_INT > 9) { 
       StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
       StrictMode.setThreadPolicy(policy); 
      } 

ADD это манифеста

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

Лучше использовать нить или AsyncTask для сетевых задач ...

+3

Это вообще не отвечает на этот вопрос. Если у него была ошибка разрешений, журнал скажет, что не NetworkOnMainThread –

+0

Я также написал «Лучше использовать поток или асинтез для сетевых задач ...» –

+3

Ужасный совет предложить * allowAll *, особенно для начинающих ... – 2Dee

0

Вы не можете сделать сетевые операции в вашем основном пользовательском интерфейсе, потому что это блокирует выполнение вашей программы с очень отвратительным опытом для ваших пользователей. Для этого вам нужно отделить сетевые операции внутри Thread, или даже лучше, AsyncTask, если вы только начинаете с мира потоков.

Это структура вы бы использовать:

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) { 
    ... 
    } 
} 

Даже имена методов очень понятны. Когда вы определяете свою AsyncTask и вызываете .execute(url_object), первый вызванный метод будет .onPreExecute(), там вы можете инициализировать переменные и подготовить все для сетевой операции, которую хотите сделать. жесткий часть вашей сети должна быть выполнена внутри doInBackground(). Там вы подключаетесь, выполняете передачу данных и отключаетесь от хоста. Наконец, вызывается onPostExecute(): после того, как вы закончите, вы можете обработать здесь свои результаты (перенести его на основную активность, показать диалог и т. Д.).

Подробнее о AsyncTasks (и знать, что означают эти параметры) Я настоятельно рекомендую прочитать reference.

Очень хороший пример можно найти here.

Смежные вопросы