Android在执行HTTP Post后20秒冻结屏幕



我正在从我的android设备执行HTTP Post,但由于某种原因,post在几秒钟内执行,但屏幕仍然冻结了18或20秒以上。

我使用的代码是:

    public boolean CommentPost(String comment, String requestId, String deviceId){
            List<NameValuePair> params = new ArrayList<NameValuePair>(6);
            params.add(new BasicNameValuePair("requestId", requestId));
            params.add(new BasicNameValuePair("comment", URLEncoder.encode(requestId)));
            params.add(new BasicNameValuePair("deviceId", URLEncoder.encode(deviceId)));
            return ExecutePost(params, "Comment/Add");
        }
private boolean ExecutePost(List<NameValuePair> params, String url){
        String queryString = RewriteParams(params);
        url = BaseURL + url + queryString;
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        try {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
            httppost.setEntity(new UrlEncodedFormEntity(params));
            HttpResponse response = httpclient.execute(httppost);
            return true;
        } catch (ClientProtocolException e) {
            return false;
        } catch (IOException e) {
            return false;
        }
    }

我用ajax和一些Http客户端(如postman)测试了该行为,执行请求并获得响应的时间不到1或2秒。为什么在安卓系统中要花更多的时间?

class Check extends AsyncTask<String, Integer, Boolean> {
    @Override
    protected Boolean doInBackground(String... params) {

            //Add main arguments here; Connection that reffers to other methods but 
    String queryString = RewriteParams(params);
    url = BaseURL + url + queryString;
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);
    try {
        httppost.setEntity(new UrlEncodedFormEntity(params));
        HttpResponse response = httpclient.execute(httppost);
        return true;
    } catch (ClientProtocolException e) {
        return false;
    } catch (IOException e) {
        return false;
    }
        return null;
    }
}

并执行如下命令:

new Check().execute("http://website.com");

如果你愿意,你可以在那里添加URL。如果是固定链接,则不需要。

你添加了这样你就可以在主线程上运行连接的东西,但我相信你的线程不是为它正确构建的。可以这样解释:

while(bool = true){
    connection code
}
rendering code

当它连接并执行所有这些操作时,由于连接需求,其他任务无法执行。运行异步允许你在不干扰主线程的情况下连接。

如果你需要不同于String, Integer和Boolean的参数,记住第一个变量是doInBackground中的参数最后一个参数将是返回值

最新更新