リモートサービスMainActivity
に IPC 呼び出しを発行する があります。AutoCompleteService
の IPC 関数の実行中AutoCompleteService
に、サービスは別の IPC コールを に発行しMainActivity
ます。
MainActivity.java
// Receive IPC call from AutoCompleteService.
private StockInfoObserver.Stub stockInfoObserver = new StockInfoObserver.Stub() {
@Override
public void update(StockInfo stockInfo) throws RemoteException {
// TODO Auto-generated method stub
Log.i(TAG, android.os.Process.myPid() + " : MainActivity receive ipc call : " + Thread.currentThread().getId());
}
};
...
...
...
// Issue IPC call to AutoCompleteService.
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// Test on API.
try {
Log.i(TAG, android.os.Process.myPid() + " : MainActivity start issue IPC call to remote service : " + Thread.currentThread().getId());
// autoCompleteApi.handle will issue IPC call to remote service.
autoCompleteApi.handle("abc");
Log.i(TAG, android.os.Process.myPid() + " : MainActivity end issue IPC call to remote service : " + Thread.currentThread().getId());
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
AutoCompleteService.java
private AutoCompleteApi.Stub autoCompleteApi = new AutoCompleteApi.Stub() {
private List<StockInfoObserver> stockInfoObservers = new ArrayList<StockInfoObserver>();
@Override
public void handle(String string) {
Log.i(TAG, android.os.Process.myPid() + " : AutoCompleteService start receive ipc call : " + Thread.currentThread().getId());
try {
for (StockInfoObserver stockInfoObserver : stockInfoObservers) {
Log.i(TAG, android.os.Process.myPid() + " : AutoCompleteService start IPC call to MainActivity : " + Thread.currentThread().getId());
// stockInfoObserver.update will issue IPC call back to MainActivity
stockInfoObserver.update(null);
Log.i(TAG, android.os.Process.myPid() + " : AutoCompleteService end IPC call to MainActivity : " + Thread.currentThread().getId());
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i(TAG, android.os.Process.myPid() + " : AutoCompleteService end receive ipc call : " + Thread.currentThread().getId());
}
@Override
public void attachStockInfoObserver(StockInfoObserver stockInfoObserver)
throws RemoteException {
if (stockInfoObservers.contains(stockInfoObserver) == false) {
stockInfoObservers.add(stockInfoObserver);
}
}
};
私の最初の予想は、デッドロックが発生することです。これは私の観察によるものです。IPC 呼び出しを発行する場合、IPC レシーバーが IPC 関数の実行を終了した後、発行者は IPC 呼び出しからのみ戻ります。
MainActivity
AutoCompleteService
throughに IPC 呼び出しを発行しautoCompleteApi.handle
ます。MainActivity
AutoCompleteService
実行が完了するまで待機します。AutoCompleteService
MainActivity
throughに IPC 呼び出しを発行しstockInfoObserver.update
ます。AutoCompleteService
MainActivity
実行が完了するまで待機します。- ただし、のスレッドはまだ待機中です。関数
MainActivity
を実行するスレッドはありません。update
- 両方のプロセスが互いに待機し続けます。
ただし、上記は発生しません。これは私が取得しているログです。すべてが完璧に機能します。
// Log in MainActivity TAG
3930 : MainActivity start issue IPC call to remote service : 1
3930 : MainActivity receive ipc call : 1
3930 : MainActivity end issue IPC call to remote service : 1
// Log in AutoCompleteService TAG
3961 : AutoCompleteService start receive ipc call : 494
3961 : AutoCompleteService start IPC call to MainActivity : 494
3961 : AutoCompleteService end IPC call to MainActivity : 494
3961 : AutoCompleteService end receive ipc call : 494
しかし、私はよくわかりません。MainActivity スレッド (ID 1 の) が関数呼び出し ( autoCompleteApi.handle
) から戻っていない場合、別の関数 ( ) を実行するために「ジャンプ」するにはどうすればよいupdate(StockInfo stockInfo)
でしょうか?
MainActivity receive ipc 呼び出しが別のスレッドによって出力されることを期待しています。ID 1 のスレッドではありません。そうでない場合は、デッドロックが発生するはずです。
試してみたい場合は、https ://www.dropbox.com/s/8hd7v5acjd213l1/jstock-android2.zip から完全なソース コードをダウンロードしてください。