我创建了一个通过 AIDL 向外部活动发送命令的服务:在此活动绑定到服务后,它向服务发送回调,因此建立了双向通信并正常工作。
相反,当我想根据从服务接收到的命令更改应用程序的 UI 时,就会出现问题。我使用简单的 Toast 通知进行了测试,但出现了一些错误......
当通过 AIDL 接收到新命令时,调用外部活动的onExecute
方法。如果我删除 Toast 通知,一切正常,但我需要根据从服务收到的命令更改 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