2011-09-07 42 views
0

我在我的应用程序中有一个导致UpdateActivity的按钮。此活动不会显示任何进度条,并且有与该更新一起运行的AsyncTask。Android长时间更新活动

AsyncTask需要相当长的时间,因为我接触到服务器并从多个表中检索信息并将它们插入到sqlite数据库中,并将数据从本地数据库发送到服务器。

如果不是更好地使用这个服务,是吗?另一方面,我怀疑。当我按下后退按钮时,我离开那个活动,但AsyncTask似乎在后面跑(因为我有一个敬酒通知用户工作已完成,并且稍后显示(即使我已经离开该活动!)。

然后我有另一个活动需要数据读取和写入数据库,所以如果我这样做,而另一个线程(下载线程)也搞乱了数据库,是否有可能出现问题有什么办法可以防止这种情况发生? 在此先感谢

+0

太多的问题老兄,把它们分开,并发布一些代码样本,让人们了解你真正的问题。 –

回答

0

在服务中运行您的任务对于任何长时间运行的操作来说都是一个好主意, 将超出您的活动。

目前线程在离开活动 后仍继续运行,但是在系统终止进程时可能会终止线程。

向用户展示已经去过的活动的用户界面对用户体验不利。

最好的办法是在服务中运行AsyncTask并使用status bar notification显示状态更新。通过这种方式,用户可以根据需要获得进度更新,并在需要时获得进度更新 。 带有状态通知的服务被视为长时间运行,除非内存真的很低,否则系统不会终止进程(因此也不会导致线程)。

至于并发访问数据库的问题,你应该写一个ContentProvider来控制对数据库的访问。 ContentProviders必须是 线程安全的,并将在您的应用程序的任何部分 中提供统一的数据访问权限,如果您希望导出数据,甚至可以被其他应用程序使用。

+0

谢谢我看了看起来并不简单,但我会尝试。另一方面,如果我有像这样定义的数据库适配器:public class SqliteDataBaseAdapter implements Serializable {...}它不会阻止几个实例吗? – vallllll

+0

[This](http:// kagii。com/post/6828016869/android-sqlite-locking)链接包含有关Android中SQLite锁定的一些信息。看起来有Java锁实现,所以你不应该得到腐败。 – mcnicholls

+0

@mcnicolsls:该链接很棒,但有一些代码用于测试不同的场景,但链接已损坏。任何想法,我可以得到该代码? – vallllll

0

如果您担心用户在同步运行时对数据进行更改,那么将其作为服务并不能真正帮助您。可以做的是杀死活动onDestroy中的AsyncTask(优雅地) )方法,这样如果用户单击后退箭头,任务将不会继续运行。

+0

以及我在想什么,但另一方面,如果我杀了asynk任务,所以也许数据将只有一半加载/一半更新。我只是逐一更新我的所有表格。所以如果数据没有被正确更新,这意味着该应用程序是无用的,所以我想知道是否有办法阻止用户停止更新中途的低谷。 – vallllll

+0

另一个想法是防止用户在更新运行时能够按下“后退”按钮。您可以通过覆盖onBackPressed()方法并引入一些逻辑来告诉它ProgressDialog是否处于活动状态。 – SBerg413