1

呼び出し元がフィードバックと戻り値を必要とするため、バインドする必要がある Service があります。バインドされたサービスを使用する必要がある少なくとも 1 つのアクティビティ、1 つのフラグメント、および 1 つの ContentProvider があります。したがって、すべての使用オブジェクトは bindService を呼び出します。そして、すべて onServiceConnected を受け取ります。これまでのところ問題ありません。これは機能します。

ただし、Activity はすべての Fragments にコンテンツを表示させたいため、ContentProvider を呼び出します。そして、フラグメントと CPがまだバインドされていないことが起こります。そのため、onServiceConnected の間、Service を使用する他のすべてのオブジェクトが接続されているかどうかはわかりません。

これを解決するには?いくつかのアイデアが頭に浮かびます:

  • onServiceConnected コールバックを受け取るオブジェクトのシーケンスを制御する方法はありますか?

  • すべての onServiceConnected 呼び出しが完了したことを確認できるアクティビティ ライフサイクル コールバックはありますか? では、フラグメントのコンテンツの入力を開始するためのより良い方法はありますか? または、Activity の onServiceConnected にメッセージを投稿した場合、このメッセージが他のすべての onServiceConnected 呼び出しの後に処理されることを確認できますか?

  • もう 1 つのアイデアは、バインドされたサービス接続を静的な単一フィールドに別の場所に保存することでした。ContentProvider にはアクセスが必要なので、Service クラスそのものを考えました。しかし、どういうわけか、これはバインドされたサービスのアイデアに反しているように見えます?!?!

他のアイデアはありますか?

ありがとう、ヨルグ

4

2 に答える 2

1

ああ、解決策を見つけたようです:

onServiceConnected で、UI スレッドにメッセージを投稿します。私の理解では、このメッセージは、保留中の他のすべての onServiceConnected コールバックが完了した後に処理されます。

だから今私のコードは次のようになります:

private ServiceConnection mConnection = new ServiceConnection() {
    @Override public void onServiceConnected(ComponentName name, IBinder service) {
        HeftBinder binder = (HeftBinder)service;
        mService = binder.getService();
        mBound = true;
        new Handler().post(new Runnable() {
            @Override public void run() {
                fillAllTheFragments();
            }
        });
    }

デュアル/クアッドコアデバイスで似たようなことを試した人はいますか?

こんにちは、ヨルグ

于 2012-04-20T17:09:02.403 に答える
0

あなたの問題に対する非常に簡単な解決策を考えることができます。

Activity、Fragment、または ContentProvider を指定された Service にバインドするときはいつでも、(Service 内の登録済み要素のカウンターを通じて) 誰が登録したかを彼に伝えます。サービス内のパブリック メソッドを使用して、Activity から登録された要素の量を取得します。

**Service.java**

private int nb_Fragments = 0;
private int nb_CProviders = 0;    

// Adds an element
public void addBoundElement(String nature)
    nb_Fragments++ OR nb_CProviders++;

// Remove an element
public void unBoundElement(String nature)
    nb_Fragments-- OR nb_CProviders--;

// Are both a Fragment and a ContentProvider bound ?
public boolean areAlreadyBound()

Service に Listener インターフェイスを実装し、新しい要素がバインドまたはバインド解除されるたびにアクティビティに通知するのとほとんど同じ操作を実行できるはずです。

于 2012-04-18T09:39:35.877 に答える