java - AsyncTask和Application的生命周期?

标签 java android

我的应用程序从创建 MyApplication 扩展应用程序开始

我有一个通过警报在后台运行的服务,当服务完成运行(获取 GPS 位置)时,我从该服务启动 AsyncTask 与我的服务器同步。

这是我的理解:

  1. Android 操作系统中一次只能运行一个应用程序。我说的是我的应用程序的实例。因此,我无法让同一个包中的应用程序对象的 2 个实例运行。
  2. 如果我看到在 Application.onCreate() 中记录的消息,则意味着操作系统关闭了我的应用程序。
  3. 服务在 UI 线程上运行,即使不可见。
  4. 如果我从我的服务中生成 AsyncTask 并且操作系统终止了我的应用程序 - AsyncTask 也会终止。我无法控制 AsyncTask 的优雅终止。
  5. 如果我安排了闹钟但应用程序已关闭 - 操作系统将发送广播,该广播将依次启动应用程序和服务。
  6. 警报每 5 分钟启动一次服务。服务尝试获取位置最多 1 分钟,完成后启动 AsyncTask。因此,我的 AsyncTask 在下次服务启动前还有 4 分钟时间。在异步任务中,我进行数据库访问,这会导致如下列出的问题..

我的理解正确吗?我之所以问这个问题,是因为我从运行应用程序的所有设备写入日志,有时会观察到奇怪的行为。大多数设备几乎 24/7 都运行应用程序,但在某些设备上我始终看到 Application_Start 记录的事件。

有什么方法可以模拟系统关闭应用程序以进行测试?我做错了什么并且需要以不同的方式做吗?我想同步我的后台处理,因为有大量数据读/写并且它正在阻塞..

java.lang.RuntimeException: An error occured while executing doInBackground()
 at android.os.AsyncTask$3.done(AsyncTask.java:299)
 at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
 at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
 at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
 at java.util.concurrent.FutureTask.run(FutureTask.java:137)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
 at java.lang.Thread.run(Thread.java:856)
Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
 at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
 at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:838)
 at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:836)
 at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
 at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143)
 at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
 at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:196)
 at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:236)
 at com.idatt.data.LockData.Lock(LockData.java:37)
 at com.idatt.common.AsyncProcessor.doInBackground(AsyncProcessor.java:154)
 at com.idatt.common.AsyncProcessor.doInBackground(AsyncProcessor.java:18)
 at android.os.AsyncTask$2.call(AsyncTask.java:287)
 at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
 ... 4 more
android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
 at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
 at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:838)
 at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:836)
 at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
 at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143)
 at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
 at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:196)
 at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:236)
 at com.idatt.data.LockData.Lock(LockData.java:37)
 at com.idatt.common.AsyncProcessor.doInBackground(AsyncProcessor.java:154)
 at com.idatt.common.AsyncProcessor.doInBackground(AsyncProcessor.java:18)
 at android.os.AsyncTask$2.call(AsyncTask.java:287)
 at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
 at java.util.concurrent.FutureTask.run(FutureTask.java:137)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
 at java.lang.Thread.run(Thread.java:856)

最佳答案

  1. 错误。 android确实可以同时运行多个进程和线程(和应用程序)。它总是这样做,尽管它通常为前台应用程序提供比其他应用程序更多的 CPU。另外,即使我从未这样做过,也可以运行您自己的应用程序的多个实例并使用多个进程。

    但是,如果您的应用程序在不在前台时不应该使用 CPU(例如游戏),请尝试这样做。没有人希望应用程序在看起来根本没有运行的情况下耗尽电池电量。

  2. 非常错误。应用程序的 onCreate 发生在开始时。如果多次出现,则表示已重新启动(由操作系统或用户重新启动)。

  3. 正确。对于后台工作,请使用工作线程。

  4. 取决于。如果您将该服务作为前台服务启动(带有通知),则操作系统将为终止该服务提供非常低的优先级。

  5. 取决于您的应用程序的用途。如果它这样做了,就会以这种方式发生。

  6. 当您创建后台服务时,您必须记住,只要操作系统认为它没有执行重要任务,就可以将其关闭。这就是为什么发生这种情况时您必须能够恢复工作。

关于java - AsyncTask和Application的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11673030/

相关文章:

java - 保存序列化的 ArrayList 在 Android 中抛出 NotSerializableException

android - Sax 解析器使用错误的标签 Android

android - 从 google play 下载应用程序时找不到您尝试购买的商品

javascript - 当我点击其他地方时如何隐藏我的滑动sidenav?

android - 安卓使用什么文件系统?

android - 前台服务不会持续运行

java - 无法创建编辑文本对象

java - hashmap自定义类键&&对象保存/加载

java - 更新(来自 p :ajax) Primefaces datatable select all rows of the table

java - Spark 驱动程序的 RMI 库导致 Full GC 暂停(System.gc())