我阅读了很多关于为异步操作创建常规体系结构的文本。 但我仍有问题。
Web上的大多数示例都显示了在AsyncTask的帮助下与Web服务的连接。 因此,当设备改变它的方向时,我们在使用这种简单的架构重新创建活动时遇到麻烦,反之亦然。 当我们的任务已经启动但是用户被按下并且我们丢失了有关当前AsyncTask的所有信息时,我们也会遇到问题。
我想构建一个架构,你可以简单地执行一些请求,并在操作结束后调用它所调用的活动。
我计划将服务用于后台操作,并ThreadExecutor
用于处理操作。
以下是我发现的有关线程和后台操作的最丰富信息。 http://www.slideshare.net/andersgoransson/efficient-android-threading
现在,您能告诉我一些实现此方法的好代码示例吗?它可以没有任何注释(不是教程mb只是项目Github
),而是使用代码,看看如何实现它。
答案 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()中的服务级别附加的侦听器。你将任务解雇给它,它会为你做任务。这需要相当多的工作量,但我发现它比大量的手动线程更容易。
如果您有明确定义的响应,它还支持缓存。