Android HTTP post asynctask

Please someone tell me how to make an http post to work in the background using AsyncTask and how to pass AsyncTask parameters? All the examples that I found were not clear enough for me, and they were about to download the file.

I run this code in my main action, and my problem is when the code sends information to the server, the application slows down, as if it was frozen for 2 - 3 seconds, then it continues to work normally until the next send. This post is http sends four variables to the server (book, libadd and time), the fourth is fixed (name)

Thanks in advance

public void SticketFunction(double book, double libadd, long time){ Log.v("log_tag", "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SticketFunction()"); //HttpClient HttpClient nnSticket = new DefaultHttpClient(); //Response handler ResponseHandler<String> res = new BasicResponseHandler(); HttpPost postMethod = new HttpPost("http://www.books-something.com"); try { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(5); nameValuePairs.add(new BasicNameValuePair("book", book+"")); nameValuePairs.add(new BasicNameValuePair("libAss", libass+"")); nameValuePairs.add(new BasicNameValuePair("Time", time+"")); nameValuePairs.add(new BasicNameValuePair("name", "jack")); //Encode and set entity postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8)); //Execute //manSticket.execute(postMethod); String response =Sticket.execute(postMethod, res).replaceAll("<(.|\n)*?>",""); if (response.equals("Done")){ //Log.v("log_tag", "!!!!!!!!!!!!!!!!!! SticketFunction got a DONE!"); } else Log.v("log_tag", "!!!!!!!?????????? SticketFunction Bad or no response: " + response); } catch (ClientProtocolException e) { // TODO Auto-generated catch block //Log.v("log_tag", "???????????????????? SticketFunction Client Exception"); } catch (IOException e) { // TODO Auto-generated catch block //Log.v("log_tag", "???????????????????? IO Exception"); } } } 
+8
android post android-asynctask
source share
2 answers

First, you place the class as follows:

 public class AsyncHttpPost extends AsyncTask<String, String, String> { interface Listener { void onResult(String result); } private Listener mListener; private HashMap<String, String> mData = null;// post data /** * constructor */ public AsyncHttpPost(HashMap<String, String> data) { mData = data; } public void setListener(Listener listener) { mListener = listener; } /** * background */ @Override protected String doInBackground(String... params) { byte[] result = null; String str = ""; HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(params[0]);// in this case, params[0] is URL try { // set up post data ArrayList<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(); Iterator<String> it = mData.keySet().iterator(); while (it.hasNext()) { String key = it.next(); nameValuePair.add(new BasicNameValuePair(key, mData.get(key))); } post.setEntity(new UrlEncodedFormEntity(nameValuePair, "UTF-8")); HttpResponse response = client.execute(post); StatusLine statusLine = response.getStatusLine(); if(statusLine.getStatusCode() == HttpURLConnection.HTTP_OK){ result = EntityUtils.toByteArray(response.getEntity()); str = new String(result, "UTF-8"); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (Exception e) { } return str; } /** * on getting result */ @Override protected void onPostExecute(String result) { // something... if (mListener != null) { mListener.onResult(result) } } } 

Now. You just write lines, for example:

 HashMap<String, String> data = new HashMap<String, String>(); data.put("key1", "value1"); data.put("key2", "value2"); AsyncHttpPost asyncHttpPost = new AsyncHttpPost(data); asyncHttpPost.setListener(new AsyncHttpPost.Listener(){ @Override public void onResult(String result) { // do something, using return value from network } }); asyncHttpPost.execute("http://example.com"); 
+29
source

Firstly, I would not recommend making an Http request in AsyncTask, better try the service. Returning to the question of how to pass a parameter to AsyncTask when you declared it, you can define each class of the AsyncTask class as follows.

 public AsyncTask <Params,Progress,Result> { } 

so in your task you should go as follows

 public MyTask extends<String,Void,Void>{ public Void doInBackground(String... params){//those Params are String because it declared like that } } 

To use it, it is quite simple

 new MyTask().execute("param1","param2","param3") 
+3
source

All Articles