gpt4 book ai didi

java - AsyncTask 执行串行而不是并行(HTTPost TimeOutException)

转载 作者:太空宇宙 更新时间:2023-11-04 10:39:04 25 4
gpt4 key购买 nike

EDIT: AsyncTask was called lots of times to update status in Server and at the same time, my app tried to upload files. AsyncTask by default, do only one operation at a time (serial mode) but you can put it in Parallel mode, as I answered below.

正常运行几个小时(有时是几分钟)后,我的应用程序停止使用 HTTPost 连接到服务器。我将超时设置为 20 秒,这是一个很好的时间,因为连接良好(wifi)。我已经在两台服务器上进行了测试:我自己的计算机和虚拟专用服务器。这个问题同样会发生。

Android 是否有某种方法或原因可以避免连接到 http 服务器?发生这种情况还有其他原因吗?有更好的方法吗?

谢谢!!

这是我发出 POST 请求的方式:

try{
new ConexaoHTTPPost.SolicitaDados(parametros).execute(url).get(20000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
new ReportException(getApplicationContext()).send(e,classeToErr);
} catch (ExecutionException e) {
new ReportException(getApplicationContext()).send(e,classeToErr);
} catch (TimeoutException e) {
new ReportException(getApplicationContext()).send(e,classeToErr);
}
<小时/>

HTTPpost 代码:

public class ConexaoHTTPPost {
public static String postDados(String urlUsuario, String parametrosUsuario) {
URL url;
HttpURLConnection connection = null;

try {
url = new URL(urlUsuario);
connection = (HttpURLConnection) url.openConnection();

connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Lenght","" + Integer.toString(parametrosUsuario.getBytes().length));
connection.setRequestProperty("Content-Language","pt-BR");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
outputStreamWriter.write(parametrosUsuario);
outputStreamWriter.flush();
outputStreamWriter.close();

InputStream inputStream = connection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));

StringBuffer resposta = new StringBuffer();

String linha;
while ( (linha = bufferedReader.readLine()) != null){
resposta.append(linha);
resposta.append('\r');
}

bufferedReader.close();

return resposta.toString();
}catch (Exception erro){
return null;
}finally {
if(connection != null){
connection.disconnect();
}
}
}

public static class SolicitaDados extends AsyncTask<String, Void, String> {

private String parametros;
//private String resultado = null;

public SolicitaDados(String parametros) {
this.parametros = parametros;
}

@Override
protected String doInBackground(String... urls) {
return ConexaoHTTPPost.postDados(urls[0], parametros);
}
/*
@Override
protected void onPostExecute(String resultado){
this.resultado = resultado;
}
*/
}
}

最佳答案

我解决了。我使用的是 execute() 方法,但实际上,正确的方法是在这一行中使用 executeOnExecutor() :

new ConexaoHTTPPost.SolicitaDados(parametros).execute(url).get(20000, TimeUnit.MILLISECONDS);

execute() 在 UI 线程中串行执行所有内容,因此您无法同时上传两个文件(或数据),因为连接会被 UI 线程阻塞。

使用executeOnExecutor()方法时,可以上传多个文件或数据。我只需更改这一行,如下所示:

new ConexaoHTTPPost.SolicitaDados(parametros).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url).get(20000, TimeUnit.MILLISECONDS);

我在所有出现的地方都更改了它。PS:您必须使用AsyncTask.THREAD_POOL_EXECUTOR作为线程执行器。

关于java - AsyncTask 执行串行而不是并行(HTTPost TimeOutException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49207043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com