我读了很多有关为异步操作创建常规体系结构的文章。
但是我仍然有问题。
网络上所有示例中的大多数都显示了在AsyncTask的帮助下与Web服务的连接。
因此,当设备更改其方向时,将其横向的方向更改为法线,反之亦然,则在使用这种简单的架构重新创建Activity时会遇到麻烦。
同样,当我们的任务开始但用户按下时,我们也会遇到问题,并且丢失了有关当前AsyncTask的所有信息。
我想建立一种体系结构,在该体系结构中,您可以简单地执行一些请求,并在操作结束后对其活动进行回调。
我计划将service用于后台操作,将ThreadExecutor
用于处理操作。
这是我发现的有关线程和后台操作的最有用的链接。
http://www.slideshare.net/andersgoransson/efficient-android-threading
所以现在,您能告诉我一些实现此方法的良好代码示例吗?它可以不带任何注释(不是教程mb只是Github
上的项目),而是带有代码,以了解如何实现。
最佳答案
我们公司正在开发移动Web桌面通信框架,在该框架中我们进行了自己的异步任务管理。
框架与远程设备一起运行,并且本地和远程设备之间的每个事务都在Transaction(AsyncTask的扩展模拟)中执行。
TransactionManager类保留所有事务并负责其执行。它具有单线程和缓存的线程池ExecutorService。如果事务被显式标记,则它可以并行运行-在高速缓存的线程池(多线程模式)上运行,而在单线程执行器上运行。之所以这样做,是因为并非所有事务都可以在多线程模式下运行(例如,当有多个事务时,它们会更改本地或远程设备的状态),因此它们可能会产生多线程后果。
可以在以下位置找到如何创建单个缓存的或固定的ExecutorService:Executors
TransactionManager本身位于Service中。服务通过本地绑定连接到所有其他应用程序的组件,如此处Bound Services所述
每个交易都有唯一的标识符,参与的设备,消息(现在执行的步骤,例如“正在连接”,“正在下载”,“正在上传”),进度和状态。
状态可以是未启动,已启动,错误,已完成。
消息用于在UI中显示它-现在执行什么。
唯一标识符(uid)用于查找交易或仅通过按意图发送其uid来将交易信息发送到另一个活动。
我们解决了屏幕旋转问题,如下所示:
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// transaction manager holds all transactions
TransactionManager transactionManager = commService.getTransactionManager();
String lsTransactionId = savedInstanceState.getString(LS_TRANSACTION_ID);
if (lsTransactionId != null) {
lsTransaction = (OutgoingTransaction<FileItem[]>) transactionManager.getTransactionById(lsTransactionId);
// update UI according to transaction state
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// if we have runnng transaction - store it's id to bundle
if (lsTransaction != null) {
outState.putString(LS_TRANSACTION_ID, lsTransaction.getId());
}
}
事务类具有执行实际工作(下载或上传数据等)的抽象方法-与AsyncTask的doInBackground方法类似。
事务具有侦听器来接收其事件:
public interface TransactionListener<T> {
/**
* Called when transaction is started.
*/
void started();
/**
* Called when transaction message is posted by Transaction.setMessage call.
* @param message message
*/
void message(String message);
/**
* Called when transaction is finished.
* @param result transaction result
*/
void finished(T result);
/**
* Called when transaction is cancelled.
*/
void cancelled();
/**
* Called when transaction error is occurred.
* @param thr throwable indicating an error
*/
void error(Throwable thr);
/**
* Called on transaction progress.
* @param value progress value
* @param total progress total
*/
void progress(long value, long total);
}
还有另一件事-为了使侦听器方法在UI线程上执行,我们制作了帮助程序类AndroidTransactionListener,该类使用Handler.post在ui线程上执行上述方法。关于处理程序,您可以在这里阅读:Handler
关于android - 多个HTTP请求的体系结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23776341/