android http post asynctask

匿名 (未验证) 提交于 2019-12-03 01:38:01

问题:

Please can anyone tell me how to make an http post to work in the background with AsyncTask and how to pass the parameters to the AsyncTask? All the examples that I found were not clear enough for me and they were about downloading a file.

I'm running this code in my main activity and my problem is when the code sends the info to the server the app slows down as if it is frozen for 2 to 3 sec's then it continues to work fine until the next send. This http post 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 res = new BasicResponseHandler();          HttpPost postMethod = new HttpPost("http://www.books-something.com");           try {             List nameValuePairs = new ArrayList(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("","");             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");         }      }  } 

回答1:

At first, You put a class like following:

public class AsyncHttpPost extends AsyncTask {     interface Listener {         void onResult(String result);     }     private Listener mListener;     private HashMap mData = null;// post data      /**      * constructor      */     public AsyncHttpPost(HashMap 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 = new ArrayList();             Iterator 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 some lines like following:

HashMap data = new HashMap(); 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"); 


回答2:

First i would not recommend do a Http request in a AsyncTask, you better try a Service instead. Going back to the issue on how to pass parameter into an AsyncTask when you declared it you can defined each Object class of the AsyncTask like this.

public AsyncTask  {  } 

so in your task you should go like this

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

To use it, it's quite simple

new MyTask().execute("param1","param2","param3") 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!