0

AIDLを使用しています。サービスとアクティビティがあります。関数 onCreate でサービスをバインドし、UI を更新したい:

private ServiceConnection conn = null;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    bindService();
    String name = conn.s.getName();

}
public class ServiceConnection implements ServiceConnection {
public IService s = null;

public void onServiceConnected(ComponentName className, IBinder boundService) {
    s = IService.Stub.asInterface((IBinder) boundService);
    Log.d(getClass().getSimpleName(), "onServiceConnected()");
}

public void onServiceDisconnected(ComponentName className) {
    s = null;
    Log.d(getClass().getSimpleName(), "onServiceDisconnected");
}
}

サービスがまだバインドされていないため、nullpointer を取得します。アクティビティがサービスにバインドされているかどうかを確認するにはどうすればよいですか?

本当に必要なのは簡単です: アクティビティを作成します -> AIDL を使用してサービスから情報を取得します -> UI を更新します。「更新」ボタンを押すとすべて正常に動作しますが、これを自動的に行う方法がわかりません。アイデア?私はスレッドを行うことができます:

while(conn.s==null)
  ;
updateUI();

しかし、それはエレガントでも効率的でもないと思います。

4

2 に答える 2

0

onCreateでは、サービスがバインドされる前に実行できないことを実行しないでください。これらの操作を実行し、onServiceConnectedが呼び出されるのを待つ必要があります。

onServiceConnectedは、探している「onConnectionEstablishedコールバック」ではありませんか?onServiceConnectedは、サービスとの接続が確立されたときに呼び出されます

于 2013-01-10T18:00:24.613 に答える
0

サービスが接続されているかどうかをテストするには、次のメソッドを ServiceConnection クラスに追加するだけです。

public boolean isConnected() {
   return s == null;
}

別の解決策: クラスにブール値を追加し、接続/切断時に true/false に設定します。

すべてのインポートを読み取る前に、どの実装が使用されているかを理解するのがより困難になるため、API クラスの名前を再利用することは一般的に非常に悪い考えです。

于 2013-01-10T17:07:08.523 に答える