0

AIDL を介して外部アクティビティにコマンドを送信するサービスを作成しました。このアクティビティがサービスにバインドされた後、サービスにコールバックが送信されるため、双方向通信が確立され、正しく機能します。

代わりに、サービスから受け取ったコマンドに従ってアプリケーションの UI を変更したい場合に問題が発生します。単純なトースト通知でテストを行ったのですが、いくつかエラーが発生してしまいました...

AIDL を介して新しいコマンドを受信すると、外部アクティビティonExecuteメソッドが呼び出されます。トースト通知を削除すると、すべてが正常に機能しますが、サービスから受け取ったコマンドに従って UI を変更する必要があります。

protected void onExecute(Bundle params) {
    Log.i(LOG_TAG, "onExecute(): " + params);

    if (params.containsKey("command01")) {
        Log.i(LOG_TAG, "onExecute(): " + params.getString("command01"));
        Toast
        .makeText(this, "Command 1...", Toast.LENGTH_SHORT)
        .show();
    }
    else if (params.containsKey("command02")) {
        Log.i(LOG_TAG, "onExecute(): " + params.getString("command02"));
        Toast
        .makeText(this, "Command 2...", Toast.LENGTH_SHORT)
        .show();
    }
    else {
        Log.w(LOG_TAG, "onExecute() - unknown command: " + params);
    }
}

以下は、エラー中に LogCat によって記録されたログを示しています。

05-07 12:45:30.676: W/dalvikvm(363): JNI WARNING: JNI method called with exception raised
05-07 12:45:30.676: W/dalvikvm(363):              in Ldalvik/system/NativeStart;.run ()V (CallStaticVoidMethodV)
05-07 12:45:30.676: W/dalvikvm(363): Pending exception is:
05-07 12:45:30.676: I/dalvikvm(363): Ljava/lang/RuntimeException;: Can't create handler inside thread that has not called Looper.prepare()
05-07 12:45:30.706: I/dalvikvm(363):    at android.os.Handler.<init>(Handler.java:121)
05-07 12:45:30.706: I/dalvikvm(363):    at android.widget.Toast.<init>(Toast.java:68)
05-07 12:45:30.706: I/dalvikvm(363):    at android.widget.Toast.makeText(Toast.java:231)
05-07 12:45:30.706: I/dalvikvm(363):    at org.example.android.applicationdemo.ApplicationDemoActivity.onExecute(ApplicationDemoActivity.java:130)
05-07 12:45:30.706: I/dalvikvm(363):    at org.example.android.applicationdemo.ApplicationDemoActivity$2.execute(ApplicationDemoActivity.java:100)
05-07 12:45:30.706: I/dalvikvm(363):    at org.example.android.servicedemo.IServiceCallback$Stub.onTransact(IServiceCallback.java:55)
05-07 12:45:30.706: I/dalvikvm(363):    at android.os.Binder.execTransact(Binder.java:320)
05-07 12:45:30.706: I/dalvikvm(363):    at dalvik.system.NativeStart.run(Native Method)
05-07 12:45:30.706: I/dalvikvm(363): "Binder Thread #2" prio=5 tid=8 NATIVE
05-07 12:45:30.706: I/dalvikvm(363):   | group="main" sCount=0 dsCount=0 obj=0x405116f0 self=0x1f1590
05-07 12:45:30.706: I/dalvikvm(363):   | sysTid=370 nice=0 sched=0/0 cgrp=default handle=2037072
05-07 12:45:30.714: I/dalvikvm(363):   | schedstat=( 18375041 37002039 19 )
05-07 12:45:30.714: I/dalvikvm(363):   at dalvik.system.NativeStart.run(Native Method)
05-07 12:45:30.714: E/dalvikvm(363): VM aborting
4

1 に答える 1

1

UI以外のスレッドで実行されるメソッド内にハンドラーを作成すると思います。ハンドラーをグローバル変数にします。

private Handler _handler = new Handler();
于 2012-05-07T13:12:14.107 に答える