android http 后异步任务

标签 android http post android-asynctask

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

我在我的主要 Activity 中运行这段代码,我的问题是当代码将信息发送到服务器时,应用程序变慢,就好像它被卡住了 2 到 3 秒,然后它继续正常工作直到下一次发送.此 http post 向服务器发送四个变量(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");
        } 
    }

}

最佳答案

起初, 你放了一个像下面这样的类:

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

关于android http 后异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7860538/

相关文章:

java - 如何在Google Map中设置几个特定位置?

C# : System.Net.WebException: 底层连接已关闭

http - 重定向 IIS/Azure 中的虚拟目录

linux - Grep 用于 http 而不是 https

http - 使用非 ASCII 字符发布 XML

android - 是否可以在移动网络浏览器中启用 WebKit JavaScript Inspector?

android - 解析 Android 嵌套查询

android - 如何访问 Android Messenger 应用程序中的编辑文本框

php - 复选框模块,如何保存、编辑和更新。 (初学者)

javascript - 在所有调用中的 $.post() 之前 Hook 附加数据