- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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 服务器?发生这种情况还有其他原因吗?有更好的方法吗?
谢谢!!
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);
}
<小时/>
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/
我对 Android 和 Java 相当陌生,下面的代码是通过 IllegalStateException 实现的。通过放置打印日志语句,我确定代码已达到以下行: "HttpPost post =
EDIT: AsyncTask was called lots of times to update status in Server and at the same time, my app tri
关于这个问题已经有很多问题了,但是尽管查看了其中的一些问题,我还是很难看出问题出在哪里。当我提交以下表格时,模型为空。关于我在这里做错了什么有什么建议吗? 模型(部分): public class I
我正在尝试让我的 Android 应用程序与我的 Spring REST Web 服务对话。我正在从 android 制作 httpost ,如下代码。但是我收到下面的异常。无论我为帖子请求的内容类型
我是一名优秀的程序员,十分优秀!