20

アクティビティから ContentProvider を呼び出した場合、ContentProvider はどのスレッドで実行されていますか?

たとえば、Activity が強制終了され、クエリが ContentProvider で実行されている場合はどうなりますか? ネットワーククエリが遅いとしましょう f.ex.

4

2 に答える 2

25

ContentResolver を使用して ContentProvider を呼び出す通常の使用例を意味する場合、私の知る限りでは次のようになります。

  1. この例では、ContentProvider が 1 つのプロセスにあり、Activity が別のプロセスにあると想定しています。

  2. ContentProvider が作成されていない場合、アプリケーションのプロセスの「メイン」スレッドを使用して onCreate() メソッドが呼び出されます。

  3. query()/insert()/update()/delete() メソッドは、他のプロセスからの着信コマンドを待機しているすべてのアプリケーション プロセスに配置されている BinderThreads を使用して呼び出されます。

query()/insert()/etc をトリガーした Activity がこれらのメソッド呼び出しの途中で強制終了された場合はどうなるでしょうか? 確かなことは言えませんが、ContentProvider プロセスは影響を受けずに続行する必要があるため、ContentProvider で起こっていることはすべて継続するとかなり確信していますが、そのメソッドが戻った後に何が起こるかははっきりとは言えません。

コンテンツ プロバイダが通常の sqlite db の代わりにネットワークに支えられていない限り、遅いネットワークがこれにどのように関与するのかまったくわかりません。

説明:

ContentProvider 関数 (クエリ/挿入/更新/削除/etc) を呼び出す場合、2 つの可能性があります。

  1. ContentProvider は呼び出し元と同じプロセスにあります。その場合、ContentProvider 関数は呼び出し元と同じスレッドで同期的に実行されます。

  2. ContentProvider は呼び出し元とは異なるプロセスにあります。その場合、ContentProvider 関数は ContentProvider プロセスのバインダー スレッドで実行されます。

どちらの場合も、呼び出し元は ContentProvider 関数が戻るまでブロックされます。いつものように、Google の完全なドキュメントや AOSP ソース コードを読んでください。

http://developer.android.com/reference/android/content/ContentProvider.html http://developer.android.com/guide/topics/providers/content-provider-basics.html http://developer.android. com/guide/components/processes-and-threads.html

于 2010-08-26T02:06:34.410 に答える
5

同じアプリケーション内のリモート プロセス (UI 以外) がクエリを実行するたびにコンテンツ プロバイダーを継続的に生成する問題をトラブルシューティングしているときに、これに遭遇しました。残念ながら、何かカスタムを作成しない限り、プロセスが実行されている限り、 ContentProvider が破棄されることはありません。通常、コンテンツ プロバイダは UI プロセス スレッド (開いていない) で実行されるため、リモート プロセスがコンテンツ プロバイダにクエリを実行する場合、クエリごとにコンテンツ プロバイダの新しいインスタンスが生成されます。その時点で実行されていません。

おそらくこれを行うためのより良い方法がありますが、作成ごとにデータベースとリソースを閉じるために独自のデータベースまたはコンテンツプロバイダーをロールするのに多大な労力を費やす代わりに、簡単な回避策を発見しました。

サービスと同じように、別のプロセスで実行する機能があることがわかりました。したがって、この例では、コンテンツ プロバイダーを、リモート サービスが配置されているプロセスと同じプロセスに移動しただけです。問題が解決され、コンテンツ プロバイダーが同じプロセスで実行され、サービスが実行されている限り 1 回だけ生成されるようになりました。android:multiprocess 属性もチェックしてください。

于 2013-01-31T17:35:26.937 に答える