在Android中发送POST数据
我对PHP,JavaScript和许多其他脚本语言都有经验,但是我对Java或Android没有太多的经验。
我正在寻找一种方法将POST数据发送到PHP脚本并显示结果。
*(重新)更新答案在Android 6.0 *
public class CallAPI extends AsyncTask<String, String, String> { public CallAPI(){ //set context variables if required } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void doInBackground(String... params) { String urlString = params[0]; // URL to call String data = params[1]; //data to post OutputStream out = null; try { URL url = new URL(urlString); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); out = new BufferedOutputStream(urlConnection.getOutputStream()); BufferedWriter writer = new BufferedWriter (new OutputStreamWriter(out, "UTF-8")); writer.write(data); writer.flush(); writer.close(); out.close(); urlConnection.connect(); } catch (Exception e) { System.out.println(e.getMessage()); } } }
参考文献:
- https://developer.android.com/reference/java/net/HttpURLConnection.html
- 如何使用POST将参数添加到HttpURLConnection
较老的答案
注意:此解决scheme已过时。 它只能在5.1以下的Android设备上运行。 Android 6.0及以上版本不包括此答案中使用的Apache HTTP客户端。
来自Apache Commons的Http客户端是最好的select。 它已经包含在android中。 这里有一个简单的例子,说明如何使用HTTP Post。
public void postData() { // Create a new HttpClient and Post Header HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php"); try { // Add your data List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("id", "12345")); nameValuePairs.add(new BasicNameValuePair("stringdata", "Hi")); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // Execute HTTP Post Request HttpResponse response = httpclient.execute(httppost); } catch (ClientProtocolException e) { // TODO Auto-generated catch block } catch (IOException e) { // TODO Auto-generated catch block } }
适用于Android 6和5
org.apache.http类和AndroidHttpClient类在Android 5.1中已被弃用 。 这些类不再被维护,您应尽快将使用这些API的任何应用程序代码迁移到URLConnection类。
https://developer.android.com/about/versions/android-5.1.html#http
想到使用HttpUrlConnection共享我的代码
public String performPostCall(String requestURL, HashMap<String, String> postDataParams) { URL url; String response = ""; try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("GET"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode=conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { String line; BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream())); while ((line=br.readLine()) != null) { response+=line; } } else { response=""; } } catch (Exception e) { e.printStackTrace(); } return response; }
…
private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException{ StringBuilder result = new StringBuilder(); boolean first = true; for(Map.Entry<String, String> entry : params.entrySet()){ if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } return result.toString(); }
也可以Post方法:
conn.setRequestMethod("POST");
更新21/02/2016
对于json的 post请求,请看这个例子:
public class Empty extends AsyncTask<Void, Void, Boolean> { String urlString = "http://www.yoursite.com/"; private final String TAG = "post json example"; private Context context; private int advertisementId; public Empty(Context contex, int advertisementId) { this.context = contex; this.advertisementId = advertisementId; } @Override protected void onPreExecute() { Log.e(TAG, "1 - RequestVoteTask is about to start..."); } @Override protected Boolean doInBackground(Void... params) { boolean status = false; String response = ""; Log.e(TAG, "2 - pre Request to response..."); try { response = performPostCall(urlString, new HashMap<String, String>() { private static final long serialVersionUID = 1L; { put("Accept", "application/json"); put("Content-Type", "application/json"); } }); Log.e(TAG, "3 - give Response..."); Log.e(TAG, "4 " + response.toString()); } catch (Exception e) { // displayLoding(false); Log.e(TAG, "Error ..."); } Log.e(TAG, "5 - after Response..."); if (!response.equalsIgnoreCase("")) { try { Log.e(TAG, "6 - response !empty..."); // JSONObject jRoot = new JSONObject(response); JSONObject d = jRoot.getJSONObject("d"); int ResultType = d.getInt("ResultType"); Log.e("ResultType", ResultType + ""); if (ResultType == 1) { status = true; } } catch (JSONException e) { // displayLoding(false); // e.printStackTrace(); Log.e(TAG, "Error " + e.getMessage()); } finally { } } else { Log.e(TAG, "6 - response is empty..."); status = false; } return status; } @Override protected void onPostExecute(Boolean result) { // Log.e(TAG, "7 - onPostExecute ..."); if (result) { Log.e(TAG, "8 - Update UI ..."); // setUpdateUI(adv); } else { Log.e(TAG, "8 - Finish ..."); // displayLoding(false); // finish(); } } public String performPostCall(String requestURL, HashMap<String, String> postDataParams) { URL url; String response = ""; try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(context.getResources().getInteger( R.integer.maximum_timeout_to_server)); conn.setConnectTimeout(context.getResources().getInteger( R.integer.maximum_timeout_to_server)); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "application/json"); Log.e(TAG, "11 - url : " + requestURL); /* * JSON */ JSONObject root = new JSONObject(); // String token = Static.getPrefsToken(context); root.put("securityInfo", Static.getSecurityInfo(context)); root.put("advertisementId", advertisementId); Log.e(TAG, "12 - root : " + root.toString()); String str = root.toString(); byte[] outputBytes = str.getBytes("UTF-8"); OutputStream os = conn.getOutputStream(); os.write(outputBytes); int responseCode = conn.getResponseCode(); Log.e(TAG, "13 - responseCode : " + responseCode); if (responseCode == HttpsURLConnection.HTTP_OK) { Log.e(TAG, "14 - HTTP_OK"); String line; BufferedReader br = new BufferedReader(new InputStreamReader( conn.getInputStream())); while ((line = br.readLine()) != null) { response += line; } } else { Log.e(TAG, "14 - False - HTTP_OK"); response = ""; } } catch (Exception e) { e.printStackTrace(); } return response; } }
更新24/08/2016
使用一些最好的库,如:
- 改造
- 齐射
因为:
- 避免HttpUrlConnection和HttpClient
在较低的API级别上(主要是在姜饼和Froyo上),HttpUrlConnection和HttpClient远非完美
- 并避免AsyncTask太
- 他们更快
- 他们caching一切
自引入蜂窝(API 11)以来,必须在与主线程不同的独立线程上执行networking操作
这样我们可以用http post方法发送数据并得到结果
public class MyHttpPostProjectActivity extends Activity implements OnClickListener { private EditText usernameEditText; private EditText passwordEditText; private Button sendPostReqButton; private Button clearButton; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login); usernameEditText = (EditText) findViewById(R.id.login_username_editText); passwordEditText = (EditText) findViewById(R.id.login_password_editText); sendPostReqButton = (Button) findViewById(R.id.login_sendPostReq_button); sendPostReqButton.setOnClickListener(this); clearButton = (Button) findViewById(R.id.login_clear_button); clearButton.setOnClickListener(this); } @Override public void onClick(View v) { if(v.getId() == R.id.login_clear_button){ usernameEditText.setText(""); passwordEditText.setText(""); passwordEditText.setCursorVisible(false); passwordEditText.setFocusable(false); usernameEditText.setCursorVisible(true); passwordEditText.setFocusable(true); }else if(v.getId() == R.id.login_sendPostReq_button){ String givenUsername = usernameEditText.getEditableText().toString(); String givenPassword = passwordEditText.getEditableText().toString(); System.out.println("Given username :" + givenUsername + " Given password :" + givenPassword); sendPostRequest(givenUsername, givenPassword); } } private void sendPostRequest(String givenUsername, String givenPassword) { class SendPostReqAsyncTask extends AsyncTask<String, Void, String>{ @Override protected String doInBackground(String... params) { String paramUsername = params[0]; String paramPassword = params[1]; System.out.println("*** doInBackground ** paramUsername " + paramUsername + " paramPassword :" + paramPassword); HttpClient httpClient = new DefaultHttpClient(); // In a POST request, we don't pass the values in the URL. //Therefore we use only the web page URL as the parameter of the HttpPost argument HttpPost httpPost = new HttpPost("http://www.nirmana.lk/hec/android/postLogin.php"); // Because we are not passing values over the URL, we should have a mechanism to pass the values that can be //uniquely separate by the other end. //To achieve that we use BasicNameValuePair //Things we need to pass with the POST request BasicNameValuePair usernameBasicNameValuePair = new BasicNameValuePair("paramUsername", paramUsername); BasicNameValuePair passwordBasicNameValuePAir = new BasicNameValuePair("paramPassword", paramPassword); // We add the content that we want to pass with the POST request to as name-value pairs //Now we put those sending details to an ArrayList with type safe of NameValuePair List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>(); nameValuePairList.add(usernameBasicNameValuePair); nameValuePairList.add(passwordBasicNameValuePAir); try { // UrlEncodedFormEntity is an entity composed of a list of url-encoded pairs. //This is typically useful while sending an HTTP POST request. UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairList); // setEntity() hands the entity (here it is urlEncodedFormEntity) to the request. httpPost.setEntity(urlEncodedFormEntity); try { // HttpResponse is an interface just like HttpPost. //Therefore we can't initialize them HttpResponse httpResponse = httpClient.execute(httpPost); // According to the JAVA API, InputStream constructor do nothing. //So we can't initialize InputStream although it is not an interface InputStream inputStream = httpResponse.getEntity().getContent(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder stringBuilder = new StringBuilder(); String bufferedStrChunk = null; while((bufferedStrChunk = bufferedReader.readLine()) != null){ stringBuilder.append(bufferedStrChunk); } return stringBuilder.toString(); } catch (ClientProtocolException cpe) { System.out.println("First Exception caz of HttpResponese :" + cpe); cpe.printStackTrace(); } catch (IOException ioe) { System.out.println("Second Exception caz of HttpResponse :" + ioe); ioe.printStackTrace(); } } catch (UnsupportedEncodingException uee) { System.out.println("An Exception given because of UrlEncodedFormEntity argument :" + uee); uee.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); if(result.equals("working")){ Toast.makeText(getApplicationContext(), "HTTP POST is working...", Toast.LENGTH_LONG).show(); }else{ Toast.makeText(getApplicationContext(), "Invalid POST req...", Toast.LENGTH_LONG).show(); } } } SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask(); sendPostReqAsyncTask.execute(givenUsername, givenPassword); } }
这是一个如何在不使用外部Apache库的情况下POST多部分数据的例子:
byte[] buffer = getBuffer(); if(buffer.length > 0) { String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "RQdzAAihJq7Xp1kjraqf"; ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); // Send parameter #1 dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"param1\"" + lineEnd); dos.writeBytes("Content-Type: text/plain; charset=US-ASCII" + lineEnd); dos.writeBytes("Content-Transfer-Encoding: 8bit" + lineEnd); dos.writeBytes(lineEnd); dos.writeBytes(myStringData + lineEnd); // Send parameter #2 //dos.writeBytes(twoHyphens + boundary + lineEnd); //dos.writeBytes("Content-Disposition: form-data; name=\"param2\"" + lineEnd + lineEnd); //dos.writeBytes("foo2" + lineEnd); // Send a binary file dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"param3\";filename=\"test_file.dat\"" + lineEnd); dos.writeBytes("Content-Type: application/octet-stream" + lineEnd); dos.writeBytes("Content-Transfer-Encoding: binary" + lineEnd); dos.writeBytes(lineEnd); dos.write(buffer); dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); dos.flush(); dos.close(); ByteArrayInputStream content = new ByteArrayInputStream(baos.toByteArray()); BasicHttpEntity entity = new BasicHttpEntity(); entity.setContent(content); HttpPost httpPost = new HttpPost(myURL); httpPost.addHeader("Connection", "Keep-Alive"); httpPost.addHeader("Content-Type", "multipart/form-data; boundary="+boundary); //MultipartEntity entity = new MultipartEntity(); //entity.addPart("param3", new ByteArrayBody(buffer, "test_file.dat")); //entity.addPart("param1", new StringBody(myStringData)); httpPost.setEntity(entity); /* String httpData = ""; ByteArrayOutputStream baos1 = new ByteArrayOutputStream(); entity.writeTo(baos1); httpData = baos1.toString("UTF-8"); */ /* Header[] hdrs = httpPost.getAllHeaders(); for(Header hdr: hdrs) { httpData += hdr.getName() + " | " + hdr.getValue() + " |_| "; } */ //Log.e(TAG, "httpPost data: " + httpData); response = httpClient.execute(httpPost); }
以@primpop答案我会添加如何转换string中的响应:
HttpResponse response = client.execute(request); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); String result = RestClient.convertStreamToString(instream); Log.i("Read from server", result); }
这里是convertStramToString的一个例子 。
更好地使用Apache Commons HttpClient,也包括在android中。 查看Android开发者:Apache HTTP客户端软件包总结,了解一般的api信息。
您可以使用此function将HTTP POST请求发送到URL。 您可以轻松发送请求并获得响应。 我总是用这个。 我很好,工作给我。
///////////////////// Check SubScription //////////////////// try { AsyncHttpClient client = new AsyncHttpClient(); // Http Request Params Object RequestParams params = new RequestParams(); String u = "B2mGaME"; String au = "gamewrapperB2M"; // String mob = "880xxxxxxxxxx"; params.put("usr", u.toString()); params.put("aut", au.toString()); params.put("uph", MobileNo.toString()); // params.put("uph", mob.toString()); client.post("http://196.6.13.01:88/ws/game_wrapper_reg_check.php", params, new AsyncHttpResponseHandler() { @Override public void onSuccess(String response) { playStatus = response; //////Get your Response///// Log.i(getClass().getSimpleName(), "Response SP Status. " + playStatus); } @Override public void onFailure(Throwable throwable) { super.onFailure(throwable); } }); } catch (Exception e) { e.printStackTrace(); }
你还需要在libs folde中添加下面的jar文件
android-async-http-1.3.1.jar
最后编辑你的build.gradle
dependencies { compile files('libs/<android-async-http-1.3.1.jar>') }
在最后重build您的项目。
你可以通过setDoOutput
(true)
, getOutputStream()
(用于发送数据) 和 getInputStream()
(用于接收)来使用URLConnection
。 Sun就是这个例子 。
接下来的工作:
private sendData() { JSONObject jsonObject = new JSONObject(); jsonObject.accumulate("key1", value1); jsonObject.accumulate("key2", value2); boolean success = sendPost(SERVER_URL + "/v1/auth", jsonObject); } private boolean sendPost(String url, JSONObject parameters) { boolean requestResult = false; InputStream inputStream = null; String result = ""; try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); String json = ""; json = parameters.toString(); StringEntity se = new StringEntity(json); httpPost.setEntity(se); httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Content-type", "application/json"); HttpResponse httpResponse = httpclient.execute(httpPost); inputStream = httpResponse.getEntity().getContent(); if (inputStream != null) { result = convertInputStreamToString(inputStream); requestResult = true; } else { result = "Did not work!"; requestResult = false; } System.out.println(result); } catch (Exception e) { Log.d("InputStream", e.getLocalizedMessage()); requestResult = false; } return requestResult; }
如果您只是想将数据附加到Url您可以通过使用HttpUrlConnection,因为HttpClient现在已被弃用。 一个更好的方法是使用类似的库,
凌空改造
我们可以将数据发布到php脚本并获取结果,并使用通过AsyncTask类执行的代码来显示它。
private class LongOperation extends AsyncTask<String, Void, Void> { // Required initialization private String Content; private String Error = null; private ProgressDialog Dialog = new ProgressDialog(Login.this); String data =""; int sizeData = 0; protected void onPreExecute() { // NOTE: You can call UI Element here. //Start Progress Dialog (Message) Dialog.setMessage("Please wait.."); Dialog.show(); Dialog.setCancelable(false); Dialog.setCanceledOnTouchOutside(false); try{ // Set Request parameter data +="&" + URLEncoder.encode("username", "UTF-8") + "="+edittext.getText(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // Call after onPreExecute method protected Void doInBackground(String... urls) { /************ Make Post Call To Web Server ***********/ BufferedReader reader=null; // Send data try { // Defined URL where to send data URL url = new URL(urls[0]); // Send POST data request URLConnection conn = url.openConnection(); conn.setConnectTimeout(5000);//define connection timeout conn.setReadTimeout(5000);//define read timeout conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write( data ); wr.flush(); // Get the server response reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuilder sb = new StringBuilder(); String line = null; // Read Server Response while((line = reader.readLine()) != null) { // Append server response in string sb.append(line + " "); } // Append Server Response To Content String Content = sb.toString(); } catch(Exception ex) { Error = ex.getMessage(); } finally { try { reader.close(); } catch(Exception ex) {} } return null; } protected void onPostExecute(Void unused) { // NOTE: You can call UI Element here. // Close progress dialog Dialog.dismiss(); if (Error != null) { Toast.makeText(getApplicationContext(),"Error encountered",Toast.LENGTH_LONG).show(); } else { try { JSONObject jsonRootObject = new JSONObject(Content); JSONObject json2 =jsonRootObject.getJSONObject("jsonkey");//pass jsonkey here String id =json2.optString("id").toString();//parse json to string through parameters //the result is stored in string id. you can display it now } catch (JSONException e) {e.printStackTrace();} } } }
但是使用诸如volley或retrofit等库是更好的select,因为Asynctask类和HttpurlConnection与库相比较慢。 此外,图书馆将获取一切,也是更快。
将数据发布为HTTP请求的方法,
public static InputStream callPostService(String Url, List<NameValuePair> data) { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(Url); try { httppost.setEntity(new UrlEncodedFormEntity(data)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); return entity.getContent(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
在较新版本的Android中,您必须将所有Web I / O请求放入新线程中。 AsyncTask最适合小型请求。
您可以使用WebServer类发布HttpRequest并在其侦听器界面中跟踪响应。
WebServer server=new WebServer(getApplicationContext()); server.setOnServerStatusListner(new WebServer.OnServerStatusListner() { @Override public void onServerResponded(String responce) { } @Override public void onServerRevoked() { } });
现在创build一个DataRack来绑定你的数据
List<DataRack> racks=new ArrayList<DataRack>(); racks.add(new DataRack("name","Simon")); racks.add(new DataRack("age","40")); racks.add(new DataRack("location","Canada"));
现在只需发送POST请求与机架
server.connectWithPOST(MainActivity.this,"http://sangeethnandakumar.esy.es/PROJECTS/PUBLIC_SERVICE/posttest.php",racks);
你需要为此包括我的图书馆。 这里的文档: https : //github.com/sangeethnandakumar/TestTube
我发现这个video教程这个有用的例子。
连接器类:
package com.tutorials.hp.mysqlinsert; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; /** * Created by Oclemmy on 3/31/2016 for ProgrammingWizards Channel. */ public class Connector { /* 1.SHALL HELP US ESTABLISH A CONNECTION TO THE NETWORK 2. WE ARE MAKING A POST REQUEST */ public static HttpURLConnection connect(String urlAddress) { try { URL url=new URL(urlAddress); HttpURLConnection con= (HttpURLConnection) url.openConnection(); //SET PROPERTIES con.setRequestMethod("POST"); con.setConnectTimeout(20000); con.setReadTimeout(20000); con.setDoInput(true); con.setDoOutput(true); //RETURN return con; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }
DataPackager类:
package com.tutorials.hp.mysqlinsert; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Iterator; /** * Created by Oclemmy on 3/31/2016 for ProgrammingWizards Channel. * 1.BASICALLY PACKS DATA WE WANNA SEND */ public class DataPackager { String name,position,team; /* SECTION 1.RECEIVE ALL DATA WE WANNA SEND */ public DataPackager(String name, String position, String team) { this.name = name; this.position = position; this.team = team; } /* SECTION 2 1.PACK THEM INTO A JSON OBJECT 2. READ ALL THIS DATA AND ENCODE IT INTO A FROMAT THAT CAN BE SENT VIA NETWORK */ public String packData() { JSONObject jo=new JSONObject(); StringBuffer packedData=new StringBuffer(); try { jo.put("Name",name); jo.put("Position",position); jo.put("Team",team); Boolean firstValue=true; Iterator it=jo.keys(); do { String key=it.next().toString(); String value=jo.get(key).toString(); if(firstValue) { firstValue=false; }else { packedData.append("&"); } packedData.append(URLEncoder.encode(key,"UTF-8")); packedData.append("="); packedData.append(URLEncoder.encode(value,"UTF-8")); }while (it.hasNext()); return packedData.toString(); } catch (JSONException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } }
发件人类别:
package com.tutorials.hp.mysqlinsert; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.widget.EditText; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; /** * Created by Oclemmy on 3/31/2016 for ProgrammingWizards Channel and Camposha.com. * 1.SEND DATA FROM EDITTEXT OVER THE NETWORK * 2.DO IT IN BACKGROUND THREAD * 3.READ RESPONSE FROM A SERVER */ public class Sender extends AsyncTask<Void,Void,String> { Context c; String urlAddress; EditText nameTxt,posTxt,teamTxt; String name,pos,team; ProgressDialog pd; /* 1.OUR CONSTRUCTOR 2.RECEIVE CONTEXT,URL ADDRESS AND EDITTEXTS FROM OUR MAINACTIVITY */ public Sender(Context c, String urlAddress,EditText...editTexts) { this.c = c; this.urlAddress = urlAddress; //INPUT EDITTEXTS this.nameTxt=editTexts[0]; this.posTxt=editTexts[1]; this.teamTxt=editTexts[2]; //GET TEXTS FROM EDITEXTS name=nameTxt.getText().toString(); pos=posTxt.getText().toString(); team=teamTxt.getText().toString(); } /* 1.SHOW PROGRESS DIALOG WHILE DOWNLOADING DATA */ @Override protected void onPreExecute() { super.onPreExecute(); pd=new ProgressDialog(c); pd.setTitle("Send"); pd.setMessage("Sending..Please wait"); pd.show(); } /* 1.WHERE WE SEND DATA TO NETWORK 2.RETURNS FOR US A STRING */ @Override protected String doInBackground(Void... params) { return this.send(); } /* 1. CALLED WHEN JOB IS OVER 2. WE DISMISS OUR PD 3.RECEIVE A STRING FROM DOINBACKGROUND */ @Override protected void onPostExecute(String response) { super.onPostExecute(response); pd.dismiss(); if(response != null) { //SUCCESS Toast.makeText(c,response,Toast.LENGTH_LONG).show(); nameTxt.setText(""); posTxt.setText(""); teamTxt.setText(""); }else { //NO SUCCESS Toast.makeText(c,"Unsuccessful "+response,Toast.LENGTH_LONG).show(); } } /* SEND DATA OVER THE NETWORK RECEIVE AND RETURN A RESPONSE */ private String send() { //CONNECT HttpURLConnection con=Connector.connect(urlAddress); if(con==null) { return null; } try { OutputStream os=con.getOutputStream(); //WRITE BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"UTF-8")); bw.write(new DataPackager(name,pos,team).packData()); bw.flush(); //RELEASE RES bw.close(); os.close(); //HAS IT BEEN SUCCESSFUL? int responseCode=con.getResponseCode(); if(responseCode==con.HTTP_OK) { //GET EXACT RESPONSE BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream())); StringBuffer response=new StringBuffer(); String line; //READ LINE BY LINE while ((line=br.readLine()) != null) { response.append(line); } //RELEASE RES br.close(); return response.toString(); }else { } } catch (IOException e) { e.printStackTrace(); } return null; } }
主要活动:
package com.tutorials.hp.mysqlinsert; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import android.widget.EditText; /* 1.OUR LAUNCHER ACTIVITY 2.INITIALIZE SOME UI STUFF 3.WE START SENDER ON BUTTON CLICK */ public class MainActivity extends AppCompatActivity { String urlAddress="http://10.0.2.2/android/poster.php"; EditText nameTxt,posTxt,teamTxt; Button saveBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); //INITIALIZE UI FIELDS nameTxt= (EditText) findViewById(R.id.nameEditTxt); posTxt= (EditText) findViewById(R.id.posEditTxt); teamTxt= (EditText) findViewById(R.id.teamEditTxt); saveBtn= (Button) findViewById(R.id.saveBtn); saveBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //START ASYNC TASK Sender s=new Sender(MainActivity.this,urlAddress,nameTxt,posTxt,teamTxt); s.execute(); } }); } }
ContentMain.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.tutorials.hp.mysqlinsert.MainActivity" tools:showIn="@layout/activity_main"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_marginTop="?attr/actionBarSize" android:orientation="vertical" android:paddingLeft="15dp" android:paddingRight="15dp" android:paddingTop="50dp"> <android.support.design.widget.TextInputLayout android:id="@+id/nameLayout" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/nameEditTxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" android:hint= "Name" /> </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout android:id="@+id/teamLayout" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/teamEditTxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Description" /> </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout android:id="@+id/posLayout" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/posEditTxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Position" /> <!--android:inputType="textPassword"--> </android.support.design.widget.TextInputLayout> <Button android:id="@+id/saveBtn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Save" android:clickable="true" android:background="@color/colorAccent" android:layout_marginTop="40dp" android:textColor="@android:color/white"/> </LinearLayout> </RelativeLayout>