Java 小型后台任务的选项

Java 小型后台任务的选项,java,android,multithreading,concurrency,android-asynctask,Java,Android,Multithreading,Concurrency,Android Asynctask,我有一个静态方法,它执行一个网络“重”调用,让我们调用它getDataFromCloudServer()。现在将组成一个新的实用方法,该方法将具有此方法。 例如: public static void periodicUpdate(Context ctx) { clearCachedData(); List<Object> newData = getDataFromCloudServer(ctx); persist(newData); } p

我有一个静态方法,它执行一个网络“重”调用,让我们调用它
getDataFromCloudServer()
。现在将组成一个新的实用方法,该方法将具有此方法。
例如:

public static void periodicUpdate(Context ctx) {  
    clearCachedData();  
    List<Object> newData = getDataFromCloudServer(ctx);  
    persist(newData);  
}
publicstaticvoidperiodicUpdate(Context-ctx){
clearCachedData();
List newData=getDataFromCloudServer(ctx);
持久化(新数据);
}
当UI线程上发生事件时,需要触发这个新的简便方法。但显然我不能从UI线程调用它。
因此,为了避免对调用方执行小型匿名异步任务,我想到:

public static void periodicUpdateInAsyncTask(final Context ctx) {  
   AsyncTask<Void, Void, Void> updaterTask = new AsyncTask<Void, Void, Void>() {   
       @Override    
       protected Void doInBackground(Void... params) {  
            periodicUpdate(ctx);  
       }  
    };
    updaterTask.execute();  
}
publicstaticvoidperiodicUpdateInAsynctask(最终上下文ctx){
AsyncTask updaterTask=新建AsyncTask(){
@凌驾
受保护的Void doInBackground(Void…params){
定期更新(ctx);
}  
};
updateTask.execute();
}
我关心的是这是否是个好主意。基本上,我认为异步任务不是“受控的”/“取消的”等。
这里的问题是什么?我如何才能正确地书写

我认为异步任务没有被“控制”/“取消”等等

实际上,AsyncTask的开发人员需要坚持取消状态

AsyncTask绑定到其流程的生命周期。所以,您可能会遇到一些问题,比如内存泄漏(您可以通过静态声明来解决),但请记住,对于后台进程,您的内存不足。如果您对此不满意,请使用服务

如果希望与活动的生命周期相关联,请使用AsyncTaskLoader

如果您不打算在UI线程中发布结果,则可以使用标准java线程

对于数据库中缓存结果的网络内容,我将使用服务

我认为异步任务没有被“控制”/“取消”等等

实际上,AsyncTask的开发人员需要坚持取消状态

AsyncTask绑定到其流程的生命周期。所以,您可能会遇到一些问题,比如内存泄漏(您可以通过静态声明来解决),但请记住,对于后台进程,您的内存不足。如果您对此不满意,请使用服务

如果希望与活动的生命周期相关联,请使用AsyncTaskLoader

如果您不打算在UI线程中发布结果,则可以使用标准java线程


对于缓存结果为DB的网络内容,我将使用服务。

AsyncTask的文档说明,您不应使用它来运行耗时超过2秒的任务,这样就排除了网络繁忙的调用。文档进一步建议使用ExecutorService或FutureTask。在我看来,你可以构建一个未来的任务,并将其pss到ExecutorService。当您需要取消它时,您可以对您持有的未来对象调用cancel。AsyncTask不是为此而设计的。那么对于我的用例来说,什么是最合适的构造呢?服务?不将其用于长任务的原因是,默认情况下,所有异步任务都在同一线程上启动。所以,如果您不通过executeOnExecutor在其自己的线程上显式启动它,您将耽误未来的所有时间AsyncTasks@GabeSechan:啊,我明白了。事实上,我并不期望网络呼叫在max5s上花费超过5秒的时间,这不是什么大问题,尤其是当您没有其他任务排队时。通常,我会在AsyncTask中的任何套接字或http调用上设置一个超时。AsyncTask的文档说明,您不应该使用它来运行耗时超过2秒的任务,这样就排除了网络繁忙的调用。文档进一步建议使用ExecutorService或FutureTask。在我看来,你可以构建一个未来的任务,并将其pss到ExecutorService。当您需要取消它时,您可以对您持有的未来对象调用cancel。AsyncTask不是为此而设计的。那么对于我的用例来说,什么是最合适的构造呢?服务?不将其用于长任务的原因是,默认情况下,所有异步任务都在同一线程上启动。所以,如果您不通过executeOnExecutor在其自己的线程上显式启动它,您将耽误未来的所有时间AsyncTasks@GabeSechan:啊,我明白了。事实上,我并不期望网络呼叫在max5s上花费超过5秒的时间,这不是什么大问题,尤其是当您没有其他任务排队时。我通常会在异步任务中的任何套接字或http调用上设置超时。