【问题标题】:android http post asynctaskandroid http post asynctask
【发布时间】:2011-10-22 15:22:52
【问题描述】:

请谁能告诉我如何使用 AsyncTask 使 http 帖子在后台工作以及如何将参数传递给 AsyncTask?我发现的所有示例对我来说都不够清楚,它们都是关于下载文件的。

我在我的主要活动中运行此代码,我的问题是当代码将信息发送到服务器时,应用程序变慢,好像它被冻结了 2 到 3 秒,然后它继续正常工作直到下一次发送.这个 http 帖子向服务器发送了四个变量(book、libadd 和 time),第四个是固定的(名称)

提前致谢

    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");
        } 
    }

}

【问题讨论】:

    标签: android http post android-asynctask


    【解决方案1】:

    起初, 你把一个类如下:

    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)
            }
        }
    }
    

    现在。 您只需编写如下几行:

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

    【讨论】:

    • 很好的解决方案!把你的项目放到一个java文件中然后去。我见过的最轻松的异步发帖方式。
    • 类中有AsyncHttpPost实例如何访问结果?
    • 像魅力一样工作谢谢,我一直在关注她和那里的不同示例,这是迄今为止最好的,谢谢。
    • Android 6.0 移除了 HttpClient,您现在应该改用 HttpURLConnection。
    【解决方案2】:

    首先我不建议在 AsyncTask 中执行 Http 请求,您最好尝试使用 Service。回到声明时如何将参数传递给 AsyncTask 的问题,您可以像这样定义 AsyncTask 的每个 Object 类。

    public AsyncTask <Params,Progress,Result> {
    
    }
    

    所以在你的任务中你应该这样做

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

    使用起来很简单

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

    【讨论】:

    • 什么是服务,您为什么推荐它?
    • 关于 Servicec 的信息很多,主要区别在于 Service 不附加到 Activity,在后台运行但仍在主线程中,还有另一种风格的 Service,称为 IntentService,它有一个在另一个线程中运行的方法。取决于我在执行 Http 请求时尝试使用 Service 的情况。
    • 好的,但是您为什么更喜欢服务?是更安全、更快、更容易还是??
    • 其中一个主要原因是异步任务依赖于活动,这意味着一旦活动完成(),一个任务不能在没有附加上下文的情况下离开,该任务也将被删除,这意味着您的HttpCalled 可能成功与否,但您只是将用户资源浪费在您甚至不会使用的东西上;至于服务,您必须使用 stopSelf 或 stopService 显式销毁它,或者将其从每个上下文中取消绑定,以便这样做更安全。有关更多信息,请访问youtube.com/watch?v=xHXn3Kg2IQE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多