多个http请求的体系结构

时间:2014-05-21 07:11:45

标签: android multithreading asynchronous

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

Web上的大多数示例都显示了在AsyncTask的帮助下与Web服务的连接。 因此,当设备改变它的方向时,我们在使用这种简单的架构重新创建活动时遇到麻烦,反之亦然。 当我们的任务已经启动但是用户被按下并且我们丢失了有关当前AsyncTask的所有信息时,我们也会遇到问题。

我想构建一个架构,你可以简单地执行一些请求,并在操作结束后调用它所调用的活动。 我计划将服务用于后台操作,并ThreadExecutor用于处理操作。

以下是我发现的有关线程和后台操作的最丰富信息。 http://www.slideshare.net/andersgoransson/efficient-android-threading

现在,您能告诉我一些实现此方法的好代码示例吗?它可以没有任何注释(不是教程mb只是项目Github),而是使用代码,看看如何实现它。

3 个答案:

答案 0 :(得分:1)

我们公司正在开发移动网络桌面通信框架,我们已经开展了自己的异步任务管理。

Framework与远程设备一起运行,本地和远程设备之间的每个事务都在Transaction(AsyncTask的扩展模拟)中执行。

TransactionManager类保存所有事务并负责执行。它具有单线程和缓存线程池ExecutorService。如果事务被明确标记,它可以并行运行 - 它在缓存线程池(多线程模式)上运行,而在单线程执行器上运行。这是因为并非所有事务都可以运行多线程,并且如果它们以多线程模式运行(例如,当有多个事务时,它们会改变本地或远程设备的状态),则可能是副作用。

如何创建单缓存或固定的ExecutorService可以在这里找到:Executors

TransactionManager本身位于Service中。服务通过本地绑定连接到所有其他应用程序的组件,如此处所述Bound Services

每个交易都有唯一标识符,参与设备,消息(现在执行的步骤,例如"连接","下载","上传"),进度和州。 状态可以是NotStarted,Started,Error,Finished。 消息用于在UI中显示它 - 现在执行的操作。 唯一标识符(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,您可以在这里阅读:Handler

答案 1 :(得分:0)

Volley图书馆可以做你想要的。如果你想要自己的图书馆也有资源。

答案 2 :(得分:0)

我已经使用过Robospice了。它具有基本上在onResume()中的服务级别附加的侦听器。你将任务解雇给它,它会为你做任务。这需要相当多的工作量,但我发现它比大量的手动线程更容易。

如果您有明确定义的响应,它还支持缓存。