AsyncTask执行Serial而不是Parallel(HTTPost TimeOutException)

时间:2018-03-10 08:34:45

标签: java android

  

编辑:多次调用AsyncTask来更新服务器中的状态   同时,我的应用程序试图上传文件。 AsyncTask by   默认情况下,一次只执行一个操作(串行模式),但您可以放置   它处于并行模式,我在下面回答。

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

Android有什么方法或理由可以避免连接到http服务器吗? 还有其他原因吗? 有没有更好的方法呢?

谢谢!

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

"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 }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

HTTPost代码:

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

1 个答案:

答案 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 作为线程执行者。