android - 多个http请求的架构

标签 android multithreading asynchronous

我阅读了很多关于为异步操作创建普通架构的文章。 但我仍然有问题。

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/

相关文章:

java - TextView 中的内嵌图像

android - 如何实现对用户当前位置的实时更新?

python - 单独线程中 Python 中的按键回显不显示第一个击键

javascript - 由于异步表单提交导致结果不一致?

c# - ASP.Net 异步 HTTP 文件上传处理程序

java - Spongy CaSTLe 有 Android SDK 要求吗?

android - 将menudrawer(外部库)添加到Android Studio 0.5.2

java - DefaultClientConnection 自动关闭

c - 在哪里可以找到不同网络架构的基准?

java - 取消@Asynchronous EJB 调用