我阅读了很多关于为异步操作创建普通架构的文章。 但我仍然有问题。
Web 上的大多数示例都显示了在 AsyncTask 的帮助下与 Web 服务的连接。 因此,当设备将横向方向更改为正常方向时,我们在使用这种简单的架构重新创建 Activity 时遇到了麻烦,反之亦然。 当我们的任务已经开始但用户按下时我们也会遇到问题,我们会丢失有关当前 AsyncTask 的所有信息。
我想构建一个架构,您可以在其中简单地执行一些请求并回调到操作结束后调用的 Activity 。
我计划将服务用于后台操作,将 ThreadExecutor
用于处理操作。
这是我找到的关于线程和后台操作的最有用的链接。 http://www.slideshare.net/andersgoransson/efficient-android-threading
那么现在,你能告诉我一些实现这种方法的好的代码示例吗?它可以没有任何评论(不是教程 mb 只是 Github
上的项目),但有代码,看看如何实现。
最佳答案
我们公司正在开发移动-网络-桌面通信框架,我们在其中进行了自己的异步任务管理。
Framework 与远程设备一起运行,本地和远程设备之间的每个事务都在 Transaction(AsyncTask 的扩展类比)中执行。
TransactionManager 类持有所有交易并负责它们的执行。它有单线程和缓存线程池ExecutorService。如果事务被显式标记,它可以并行运行——它在缓存线程池(多线程模式)上运行,否则它在单线程执行器上运行。之所以这样做,是因为并非所有事务都可以多线程运行,并且如果它们以多线程模式运行(例如,当有多个事务时,会更改本地或远程设备的状态),则可能会产生副作用。
如何创建单缓存或固定的 ExecutorService 可以在这里找到:Executors
TransactionManager本身位于Service中。服务通过本地绑定(bind)连接到所有其他应用程序的组件,如此处所述Bound Services
每笔交易都有唯一标识、参与设备、消息(现在执行的步骤,如“正在连接”、“正在下载”、“正在上传”)、进度和状态。 状态可以是 NotStarted、Started、Error、Finished。 消息用于在 UI 中显示它 - 现在执行的操作。 唯一标识符 (uid) 用于查找交易或将交易信息发送到另一个 Activity ,只需发送它的 Intent 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/