编辑:多次调用AsyncTask来更新服务器中的状态 同时,我的应用程序试图上传文件。 AsyncTask by 默认情况下,一次只执行一个操作(串行模式),但您可以放置 它处于并行模式,我在下面回答。
在几个小时(有时是几分钟)内正常运行后,我的应用程序停止使用HTTPost连接到服务器。我将Timeout设置为20秒,这是一个很好的时间,因为连接良好(wifi)。我在两台服务器上测试过它:我自己的计算机和虚拟专用服务器。问题同样存在。
Android有什么方法或理由可以避免连接到http服务器吗? 还有其他原因吗? 有没有更好的方法呢?
谢谢!
"agenda": {
".read": "auth != null",
".write": "auth != null && root.child('members/'+auth.uid+'/role').val() === 'admin'",
"activitys": {
"$year": {
"$month": {
"$day": {
"$time": {
"$room_id": {
".write" : "auth != null && (!newData.exists() && root.child('members/'+auth.uid+'/role').val() === 'admin')",
"registrations": {
"approved": {
"$key" : {
".write" : "auth != null && (20 > 10) || !newData.exists())",
".validate": "newData.hasChildren(['email', 'full_name'])",
//You can add individual validation for name and mail here
"full_name": { ".validate": true },
"email": { ".validate": true },
//This rule prevents validation of data with more child than defined in the 2 lines above (or more if you specify more children)
"$other": { ".validate": false }
}
}
}
}
}
}
}
}
}
}
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);
}
答案 0 :(得分:0)
我解决了它。 我正在使用 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 作为线程执行者。