0

私のアプリケーションは作成から始まりますMyApplication extends Application

アラームによってバックグラウンドで実行されるサービスがあり、サービスの実行が完了すると(GPS位置を取得)AsyncTask、サーバーと同期するためにそのサービスから開始します。

これが私の理解です:

  1. ApplicationAndroidOSで一度に実行できるのは1つだけです。私は私のアプリケーションのインスタンスについて話している。したがって、同じパッケージからアプリケーションオブジェクトの2つのインスタンスを実行する方法はありません。
  2. 内部にログインしたメッセージが表示された場合Application.onCreate()は、OSがアプリケーションをシャットダウンしたことを意味します。
  3. サービスは、表示されていなくてもUIスレッドで実行されます。
  4. サービスからスポーンAsyncTaskし、OSがアプリケーションを強制終了した場合、AsyncTaskgetも終了します。AsyncTaskの正常な終了を制御する方法はありません。
  5. アラームがスケジュールされていて、アプリケーションがダウンしている場合、OSはブロードキャストを送信し、次にアプリケーションを開始してからサービスを開始します。
  6. アラームは5分ごとにサービスを開始します。サービスは最大1分間位置を取得しようとし、完了するとAsyncTaskを開始します。したがって、私のAsyncTaskには、次のサービス開始の4分前があります。非同期タスク内でDBアクセスを行うと、以下のような問題が発生します。

私の理解は正しいですか?理由私はアプリケーションを実行するすべてのデバイスからログを書き込み、時々奇妙な動作を観察するので、これを求めています。ほとんどのデバイスはほぼ24時間年中無休でアプリケーションを実行しますが、一部のデバイスでは、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)
4

1 に答える 1

1
  1. 間違い 。androidは、実際には複数のプロセスとスレッド(およびアプリ)を同時に実行できます。通常はフォアグラウンドアプリに他のアプリよりも多くのCPUを提供しますが、常にそれを実行します。また、これまで行ったことがない場合でも、独自のアプリの複数のインスタンスを実行して、複数のプロセスを使用することは可能です。

    ただし、アプリがフォアグラウンドにないときにCPUを使用するべきではない場合(ゲームなど)は、そうしてみてください。実行されていないように見えてもバッテリーを消耗するアプリは誰も望んでいません。

  2. 大きな過ち 。アプリのonCreateは最初に発生します。複数回発生する場合は、(OSまたはユーザーのいずれかによって)再起動されたことを意味します。

  3. 正しい 。バックグラウンド作業には、ワーカースレッドを使用します。

  4. に依存します。サービスをフォアグラウンドサービス(通知付き)として開始している場合、OSはサービスの強制終了の優先度を非常に低くします。

  5. アプリの機能によって異なります。それを行う場合、それはこのように発生します。

  6. バックグラウンドサービスを作成するときは、OSが重要なタスクを実行しないと判断した場合はいつでも、OSがサービスを閉じることができることを覚えておく必要があります。そのため、このようなことが発生した場合は、作業を再開できる必要があります。

于 2012-07-26T17:30:38.320 に答える