1

ユーザーがアプリを使用してオンライン支払いなどのオンライントランザクションを実行する必要があるユースケースを考えます。

これはUIをブロックせずに実行する必要があるため、AsyncTaskを使用する予定でした。問題は次のシナリオにあります。-ユーザーが電話を回転させるか、トランザクションの途中で着信コールを受信するため、アクティビティが停止されます。

私が正しく理解していれば、asynctaskには古いオブジェクトへの参照があります。したがって、トランザクションが完了した後、結果についてユーザーに通知する方法はありません。それは...ですか?

代わりにサービスを使用する必要がありますか?

4

1 に答える 1

2

サービスとは何ですか?

Serviceクラスに関するほとんどの混乱は、実際にはそうでないものを中心に展開します。

  • サービスは別個のプロセスではありません。Serviceオブジェクト自体は、それが独自のプロセスで実行されていることを意味するものではありません。特に指定がない限り、その一部であるアプリケーションと同じプロセスで実行されます。
  • サービスはスレッドではありません。これは、メインスレッドから作業を行うための手段ではありません(アプリケーションが応答しないエラーを回避するため)。

サービスまたはスレッドを使用する必要がありますか?

サービスは、ユーザーがアプリケーションを操作していない場合でもバックグラウンドで実行できる単なるコンポーネントです。したがって、それが必要な場合にのみサービスを作成する必要があります。

メインスレッドの外部で作業を実行する必要があるが、ユーザーがアプリケーションを操作しているときにのみ実行する必要がある場合は、代わりに、サービスではなく新しいスレッドを作成する必要があります。たとえば、音楽を再生したいが、アクティビティの実行中にのみ、onCreate()でスレッドを作成し、onStart()で実行を開始してから、onStop()で停止することができます。また、従来のThreadクラスの代わりに、AsyncTaskまたはHandlerThreadの使用を検討してください。スレッドの詳細については、プロセスとスレッドのドキュメントを参照してください。

サービスを使用する場合でも、デフォルトではアプリケーションのメインスレッドで実行されるため、集中的な操作やブロック操作を実行する場合は、サービス内に新しいスレッドを作成する必要があります。

ユーザーが電話を回転させたときにアクティビティが停止する原因は何ですか?

デバイスの構成(Resources.Configurationクラスで定義)が変更された場合、ユーザーインターフェイスを表示するものはすべて、その構成に一致するように更新する必要があります。アクティビティはユーザーと対話するための主要なメカニズムであるため、構成の変更を処理するための特別なサポートが含まれています。

特に指定しない限り、構成の変更(画面の向き、言語、入力デバイスなどの変更など)により、現在のアクティビティが破棄され、onPause()、onStop()、およびの通常のアクティビティライフサイクルプロセスが実行されます。必要に応じてonDestroy()。アクティビティがフォアグラウンドにあるか、ユーザーに表示されている場合、そのインスタンスでonDestroy()が呼び出されると、前のインスタンスがonSaveInstanceState(Bundle)から生成したsavedInstanceStateを使用して、アクティビティの新しいインスタンスが作成されます。

アクティビティの再作成によるAsyncTaskの中断を解決するための可能な回避策:

特殊なケースでは、1つ以上のタイプの構成変更に基づいて、アクティビティの再開をバイパスしたい場合があります。これは、マニフェストのandroid:configChanges属性を使用して行われます。そこで処理すると言うあらゆるタイプの構成変更について、再起動する代わりに、現在のアクティビティのonConfigurationChanged(Configuration)メソッドへの呼び出しを受け取ります。ただし、構成の変更に処理しないものが含まれる場合でも、アクティビティは再開され、onConfigurationChanged(Configuration)は呼び出されません。

于 2012-06-29T03:05:38.613 に答える