Как отправить данные на сайт с помощью httpPost, сбоев приложений

В настоящее время я работаю над проектом. Мне нужно отправить некоторые данные из моего приложения Android на веб-сервер. Но когда я коснулся кнопки отправки, приложение выйдет из строя.

Вот мой .java-файл

package com.androidexample.httppostexample; import java.io.IOException; import org.apache.http.client.ClientProtocolException; import java.util.ArrayList; import java.util.List; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.message.BasicNameValuePair; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class HttpPostExample extends Activity { Button sendButton; EditText msgTextField; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // load the layout setContentView(R.layout.activity_http_post_example); // make message text field object msgTextField = (EditText) findViewById(R.id.msgTextField); // make send button object sendButton = (Button) findViewById(R.id.sendButton); } // this is the function that gets called when you click the button public void send(View v) { // get the message from the message text box String msg = msgTextField.getText().toString(); // make sure the fields are not empty if (msg.length()>0) { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://www.eeecoderpages.orgfree.com/post.php"); try { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("id", "12345")); nameValuePairs.add(new BasicNameValuePair("message", msg)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); httpclient.execute(httppost); msgTextField.setText(""); // clear text box } catch (ClientProtocolException e) { // TODO Auto-generated catch block } catch (IOException e) { // TODO Auto-generated catch block } } else { // display message if text fields are empty Toast.makeText(getBaseContext(),"All field are required",Toast.LENGTH_SHORT).show(); } } } 

Вот мой файл xml gui:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:text="Message" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/msgTextField" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:text="Send" android:id="@+id/sendButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="send" /> </LinearLayout> Отправить <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:text="Message" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/msgTextField" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:text="Send" android:id="@+id/sendButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="send" /> </LinearLayout> 

Я также добавляю разрешение интернета на манифест:

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

А на стороне веб-сервера я использовал следующий скрипт php :

 <?php // get the "message" variable from the post request // this is the data coming from the Android app $message=$_POST["message"]; // specify the file where we will save the contents of the variable message $filename="androidmessages.html"; // write (append) the data to the file file_put_contents($filename,$message."<br />",FILE_APPEND); // load the contents of the file to a variable $androidmessages=file_get_contents($filename); // display the contents of the variable (which has the contents of the file) echo $androidmessages; ?> 

Но это не сработает. Когда я коснулся кнопки отправки, система выключила мое приложение. Я искал множество решений, но не для них работает для меня. Любая помощь любого тела я буду благодарна!

Работа с сетью в интерфейсе пользовательского интерфейса не разрешена.

Попробуйте выполнить следующий код.

 public class NetRequestAsync extends AsyncTask<Void, Void, Boolean> { String id, msg; public NetRequestAsync(String id, String message) { this.id = id; this.msg = message; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Boolean doInBackground(Void... params) { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost( "http://www.eeecoderpages.orgfree.com/post.php"); try { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>( 2); nameValuePairs.add(new BasicNameValuePair("id", id)); nameValuePairs.add(new BasicNameValuePair("message", msg)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); httpclient.execute(httppost); return true; } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return false; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); if(result){ //successful request }else{ //error in request response } msgTextField.setText(""); // clear text box } } 

Чтобы использовать этот код,

 NetRequestAsync request = new NetRequestAsync("12345","Hi"); request.execute(); 

Заметка

Работа с пользовательским интерфейсом, как обновление TextView, EditText или установка изображения в ImageView, не допускается в doInBackground() . Вы можете сделать это в onPostExecute() или onPreExecute() .

Вы выполняете операцию, связанную с сетью, на основном потоке ui. Используйте thread или asynctask .

Вы получите сообщение сотовой сети NetworkOnMainThreadexception .

  new PostTask().execute(); 

AsyncTask

  class PostTask extends AsyncTask<Void,Void,Void> { @Override protected void doInbackground(Void... params) { // network related operation // do not update ui here // your http post here } } 

Также, если вы используете threads или asynctask не забудьте обновить ui в doInbackgroud .

У вас есть это

  String msg = msgTextField.getText().toString(); // you can pass msg to asynctask doInbackground or to the asynctask contructor msgTextField.setText(""); 

Используйте onPreExecute и onPostExecute для обновления ui.

Похоже, вы получаете NetworkOnMainThread Exception

Причина: вы выполняете работу в Network Operation on Main UI Thread

Решение: используйте AsyncTask