Я искал способ отправить данные на php-страницу на удаленном сервере и не могу заставить ее работать … Я изменил код из аналогичного вопроса здесь, но он не работает. Я должен поместите httppost в асинтезу или что-то еще? Как мне это сделать? Код:
public class gameOver extends Activity { //TextView hiscores; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gameover); final Button b = (Button) findViewById(R.id.button1); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Perform action on click Toast.makeText(gameOver.this, "button was pressed", Toast.LENGTH_SHORT).show(); try { JSONObject json = new JSONObject(); json.put("timestamp", 1351181576.64078); json.put("name", "engine_speed"); json.put("value", 714.0); postData(json); JSONObject json2 = new JSONObject(); json2.put("timestamp", 1351181576.7207818); json2.put("name", "steering_wheel_angle"); json2.put("value", 11.1633); postData(json2); } catch (JSONException e) { e.printStackTrace(); } } }); } public void postData(JSONObject json) throws JSONException { HttpClient httpclient = new DefaultHttpClient(); String URL = "http://www.mysite.com/s.php"; try { HttpPost httppost = new HttpPost(URL); List<NameValuePair> nvp = new ArrayList<NameValuePair>(2); nvp.add(new BasicNameValuePair("json", json.toString())); httppost.setEntity(new UrlEncodedFormEntity(nvp)); HttpResponse response = httpclient.execute(httppost); if(response != null) { InputStream is = response.getEntity().getContent(); //input stream is response that can be shown back on android Toast.makeText(gameOver.this, (CharSequence) is, Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(gameOver.this, "data Not sent", Toast.LENGTH_SHORT).show();} }catch (Exception e) { e.printStackTrace(); } } }
LogCat:
09-06 11:45:28.986: W/System.err(30433): android.os.NetworkOnMainThreadException 09-06 11:45:28.986: W/System.err(30433): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 09-06 11:45:28.986: W/System.err(30433): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 09-06 11:45:28.986: W/System.err(30433): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 09-06 11:45:28.986: W/System.err(30433): at java.net.InetAddress.getAllByName(InetAddress.java:214) 09-06 11:45:28.986: W/System.err(30433): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 09-06 11:45:28.986: W/System.err(30433): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 09-06 11:45:28.986: W/System.err(30433): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 09-06 11:45:28.986: W/System.err(30433): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 09-06 11:45:28.986: W/System.err(30433): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 09-06 11:45:28.986: W/System.err(30433): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 09-06 11:45:28.986: W/System.err(30433): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 09-06 11:45:28.986: W/System.err(30433): at com.example.testgallery.gameOver.postData(gameOver.java:90) 09-06 11:45:28.986: W/System.err(30433): at com.example.testgallery.gameOver$1.onClick(gameOver.java:65) 09-06 11:45:28.986: W/System.err(30433): at android.view.View.performClick(View.java:4240) 09-06 11:45:28.986: W/System.err(30433): at android.view.View$PerformClick.run(View.java:17721) 09-06 11:45:28.986: W/System.err(30433): at android.os.Handler.handleCallback(Handler.java:730) 09-06 11:45:28.986: W/System.err(30433): at android.os.Handler.dispatchMessage(Handler.java:92) 09-06 11:45:28.986: W/System.err(30433): at android.os.Looper.loop(Looper.java:137) 09-06 11:45:28.986: W/System.err(30433): at android.app.ActivityThread.main(ActivityThread.java:5103) 09-06 11:45:28.986: W/System.err(30433): at java.lang.reflect.Method.invokeNative(Native Method) 09-06 11:45:28.986: W/System.err(30433): at java.lang.reflect.Method.invoke(Method.java:525) 09-06 11:45:28.986: W/System.err(30433): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 09-06 11:45:28.996: W/System.err(30433): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 09-06 11:45:28.996: W/System.err(30433): at dalvik.system.NativeStart.main(Native Method) 09-06 11:45:28.996: W/System.err(30433): android.os.NetworkOnMainThreadException 09-06 11:45:28.996: W/System.err(30433): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 09-06 11:45:28.996: W/System.err(30433): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 09-06 11:45:28.996: W/System.err(30433): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 09-06 11:45:28.996: W/System.err(30433): at java.net.InetAddress.getAllByName(InetAddress.java:214) 09-06 11:45:28.996: W/System.err(30433): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 09-06 11:45:28.996: W/System.err(30433): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 09-06 11:45:28.996: W/System.err(30433): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 09-06 11:45:28.996: W/System.err(30433): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 09-06 11:45:28.996: W/System.err(30433): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 09-06 11:45:28.996: W/System.err(30433): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 09-06 11:45:28.996: W/System.err(30433): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 09-06 11:45:28.996: W/System.err(30433): at com.example.testgallery.gameOver.postData(gameOver.java:90) 09-06 11:45:28.996: W/System.err(30433): at com.example.testgallery.gameOver$1.onClick(gameOver.java:71) 09-06 11:45:28.996: W/System.err(30433): at android.view.View.performClick(View.java:4240) 09-06 11:45:28.996: W/System.err(30433): at android.view.View$PerformClick.run(View.java:17721) 09-06 11:45:28.996: W/System.err(30433): at android.os.Handler.handleCallback(Handler.java:730) 09-06 11:45:28.996: W/System.err(30433): at android.os.Handler.dispatchMessage(Handler.java:92) 09-06 11:45:28.996: W/System.err(30433): at android.os.Looper.loop(Looper.java:137) 09-06 11:45:28.996: W/System.err(30433): at android.app.ActivityThread.main(ActivityThread.java:5103) 09-06 11:45:28.996: W/System.err(30433): at java.lang.reflect.Method.invokeNative(Native Method) 09-06 11:45:28.996: W/System.err(30433): at java.lang.reflect.Method.invoke(Method.java:525) 09-06 11:45:28.996: W/System.err(30433): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 09-06 11:45:28.996: W/System.err(30433): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 09-06 11:45:28.996: W/System.err(30433): at dalvik.system.NativeStart.main(Native Method)
Вы должны использовать AsyncTask для отправки данных. Я не знаю вашу php-страницу, однако я попытаюсь объяснить, как отправлять данные на сервер из Android с помощью JSON (если у вас есть другие проблемы, обратитесь к этому учебному пособию http://www.androidhive.info/2012/05/how -to-connect-android-with-php-mysql / ). Вы отправляете три значения на сервер в виде запроса POST. Я думаю, ваш php-файл должен получить три переменные и вставить их в базу данных, а затем отправить обратно данные соответственно.
Ваш php-файл (я предполагаю, что вы хотите вставить эти значения в базу данных с именем «Сведения, имеющие три столбца timestamp, имя, значение», а затем сообщите пользователю приложения, были ли данные вставлены или нет.)
insert.php
<?php //connect to your database //declare an array to encode your response $arr = array(); if((isset($_POST["timestamp"]))&&(isset($_POST["name"]))&&(isset($_POST["value"]))) { $time = $_POST["timestamp"]; $name = $_POST["name"]; $value = $_POST["value"]; $query = "insert into Details(timestamp,name,value) values '$time','$name','$value'"; $result = mysql_query($result); if ($result) { // successfully inserted into database $arr["success"] = 1; $arr["message"] = "Data successfully inserted."; // echoing JSON response echo json_encode($arr); } else { // failed to insert row $arr["success"] = 0; $arr["message"] = "An error occurred."; // echoing JSON response echo json_encode($arr); } } else { // required field is missing $arr["success"] = 0; $arr["message"] = "Required field(s) is missing"; // echoing JSON response echo json_encode($arr); } ?>
Ваш класс gameOver должен иметь подкласс, который должен расширять AsyncTask и выполнять вставку JSON.
Активность игры
public class gameOver extends Activity { //TextView hiscores; JSONParser jsonParser; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gameover); final Button b = (Button) findViewById(R.id.button1); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Perform action on click Toast.makeText(gameOver.this, "button was pressed", Toast.LENGTH_SHORT).show(); new Insert().execute(); } }); } class Insert extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(gameOver.this); pDialog.setMessage("Inserting Details.."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } @Override protected String doInBackground(String... arg0) { jsonParser = new JSONParser(); //Building Parameters List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("timestamp",1351181576.64078)); params.add(new BasicNameValuePair("name","engine_speed")); params.add(new BasicNameValuePair("value", 714.0)); //getting JSON Object JSONObject json = jsonParser.makeHttpRequest("<your-domain-name>/insert.php", "POST", params); //Log.d("JSON:",json.toString()); try { success = json.getInt("success"); if(success == 1){ Log.d("Query","Data Successfully inserted"); }else{ Log.d("Query","Unsuccessful in data submition"); } }catch(JSONException e){ Log.d("JSON:","EXCEPTION"); } return null; }
Вышеупомянутый класс JSONParser
package <your-package-name>; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONException; import org.json.JSONObject; import android.util.Log; public class JSONParser { static InputStream is = null; static JSONObject jObj = null; static String json = ""; // constructor public JSONParser() { } // function get json from url // by making HTTP POST or GET method public JSONObject makeHttpRequest(String url, String method, List<NameValuePair> params) { // Making HTTP request try { // check for request method if(method == "POST"){ // request method is POST // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); httpPost.setEntity(new UrlEncodedFormEntity(params)); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); }else if(method == "GET"){ // request method is GET DefaultHttpClient httpClient = new DefaultHttpClient(); String paramString = URLEncodedUtils.format(params, "utf-8"); url += "?" + paramString; HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); json = sb.toString(); } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); } // try parse the string to a JSON object try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } // return JSON String return jObj; } }
Да, вы должны обязательно использовать AsyncTask
для этого! В вашем коде вы можете создать класс, расширяющий AsyncTask
:
public class LoadData extends AsyncTask<String, Integer, JSONObject> {
В этом классе вы переопределите 2 метода: doInBackground
, который будет выполнять в основном код, который у вас есть в вашем методе onPostExecute()
, и onPostExecute()
который будет обрабатывать с ответом сервера.
protected JSONObject doInBackground(String... urls) { // Build your json objects and create an HttpPost that will contact the url in urls[0] // then return a JSONObject containing the response } protected void onPostExecute(JSONObject result) { // parse the content of result to analyze the response of the server }
Затем в вашем методе onClick
вы можете создать экземпляр этого класса и вызвать его execute
, передав URL-адрес, к которому вы хотите получить доступ:
LoadData loadData = new LoadData(getApplicationContext()); loadData.execute(your_url);
РЕДАКТИРОВАТЬ
Я помню, как некоторое время назад писал похожий код для другого человека, вы можете проверить это сообщение для другого примера: получение значения с использованием JSON nullpointer