2013-09-03 4 views
1

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

Вот мой .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-файл графического интерфейса:

<?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; 


    ?> 

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

+3

Что говорит логарифм «NetworkOnMainThreadexception»? – Raghunandan

+0

ребята, спасибо за все ваши ответы !. Но он все еще не работает. Кнопка отправки сейчас хороша. Приложение не разбилось, когда я больше касаюсь кнопки. Но на моем веб-сайте php нет никаких данных, которые я отправляю. пожалуйста помоги. Почему это не работает? Я не понимаю. Я также добавляю разрешение на чтение и запись в файл html. Он по-прежнему не получает новые данные, которые я отправляю с android. Кроме того, в журнале ошибок нет ошибок, когда я открываю приложение и прикасаюсь к кнопке для отправки данных. – eeecoder

ответ

1

Это звучит, как вы получаете NetworkOnMainThread Exception

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

Решение: использования AsyncTask

+0

, пожалуйста, прочитайте комментарий, который я изложил ниже. – eeecoder

1

Вы делаете сеть, связанную операцию на основном потоке пользовательского интерфейса , Используйте 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 не помню, чтобы обновить пользовательский интерфейс в doInbackgroud.

Вы это

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

Использование onPreExecute и onPostExecute для Ui Updation.

2

Работа в сети в пользовательском интерфейсе Основная тема не допускается.

Попробуйте ввести код.

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(); 

Note

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