我正在重构我前段时间制作的应用程序.那时我正迈出第一步迈向Android,简单的方法就是避免方向改变,几乎所有我使用AsyncTask类的CRUD操作都没有实现Content Provider或者使用Fragments.
现在我做了一些改变:
>我使用Fragments来封装功能
>对数据库的所有访问都是通过Content Provider完成的
>我使用CursorLoaders来检索我的数据,利用LoaderFramework带来的内容观察和自动后台加载.
我现在唯一的问题是我不太确定如何处理其余的CRUD操作(创建,更新和删除).
我发现我可以使用AsyncQueryHandler类,但在线信息不足.
我喜欢Loader Framework的一件事是知道Activity或Fragment生命周期,但是AsyncQueryHandler呢?
>当Activity / Fragment经历配置更改时,startDelete,startInsert,startUpdate启动的操作会发生什么?或者当我按下后退按钮?或者更糟糕的是,如果活动被破坏了?
>在这种情况下,此类操作的预期行为是什么?他们应该被取消还是应该继续工作?
我上面提到的所有操作并不复杂.对于真正的复杂操作,我使用过Services或IntentServices,但由于我不认为在主线程上运行SQLite操作是个好主意,我想使用更好的解决方案,但首先我需要知道该解决方案应该如何应对Activity / Fragment生命周期事件.
任何意见或建议将非常感谢.
谢谢.
解决方法:
如果使用AsyncQueryHandler,则必须考虑创建此抽象包装器并在启动它的线程上执行提供程序操作.如果从UI线程调用此函数,则回调将被发送到UI线程.如果从另一个工作线程调用它,则回调将被发送到该工作线程.
这不受片段或活动的生命周期的约束,ContentProviders没有生命周期.
基本级别的AsyncQueryHandler创建一个Message对象,该对象被添加到单个后台线程的MessageQueue中.无论您使用AsyncQueryHandler的哪个活动/片段,所有Message对象都将在同一MessageQueue上结束.
后台线程处理请求后,它会将响应发送回最初发出请求的AsyncQueryHandler实例.
我的建议是使用Android的Loaders.这些与活动/片段的生命周期直接相关.您可以在LoaderManager中拥有多个Loader(每个活动/片段一个LoaderManager),这样可以执行更复杂的操作.当内容发生变化时,您的活动/片段将自动得到通知(当您希望将其与CRUD操作的自定义方法结合使用或者需要使用长时间运行的服务时非常有用).他们的另一个非常重要的功能是它们将始终重新连接到最后一个Loader,因此您将避免重新查询您的内容.
我建议您搜索一些在Android中实现Loaders的教程.你可以从这些开始:
> Loaders – part 1
> Loaders – part 2
> Loaders – part 3
> Loaders – part 4
回答你上次的评论:
我建议使用EventBus库(https://github.com/greenrobot/EventBus)在AsyncTasks / Thread和其他组件之间进行通信.
您可以首先创建一个抽象的AsyncTask / Thread,然后在其上创建特定的命令.
例如:
public abstract class AbstractThread extends Thread {
@Override
public void run() {
super.run();
command();
}
abstract void command();
}
在抽象类中,您可以进行一些数据库初始化,验证或其他可能对您的应用程序有意义的事情.
public class InserTask extends AbstractThread{
@Override
void command() {
//TODO: Add logic for the insert task
}
}
public class UpdateTask extends AbstractThread{
@Override
void command() {
//TODO: Add logic for the update task
}
}
在这些特定的类中,只需添加CRUD操作的逻辑.
要控制这些线程,比如它们应该被停止,暂停,恢复,你可以创建和ThreadPool管理器来控制你的线程.您可以在此处阅读更多如何实现此目的:Thread Pool
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!