我读了很多有关为异步操作创建常规体系结构的文章。
但是我仍然有问题。

网络上所有示例中的大多数都显示了在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/

10-12 03:21