Android 如何根据从服务接收的命令更改活动的UI?

Android 如何根据从服务接收的命令更改活动的UI?,android,android-service,android-ui,Android,Android Service,Android Ui,我创建了一个通过AIDL向外部活动发送命令的服务:在该活动绑定到该服务之后,它向该服务发送回调,这样就建立了双向通信并正常工作 相反,当我想根据从服务接收到的命令更改应用程序的UI时,问题就出现了。我使用一个简单的Toast通知执行了一个测试,但出现了一些错误 当通过AIDL接收到新命令时,调用外部活动的onExecute方法。如果我删除Toast通知,一切都正常工作,但我需要根据从服务接收的命令更改UI protected void onExecute(Bundle params) {

我创建了一个通过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
05-07 12:45:30.676:W/dalvikvm(363):JNI警告:调用JNI方法时引发异常
05-07 12:45:30.676:W/dalvikvm(363):在Ldalvik/system/NativeStart;中;。运行()V(CallStaticVoidMethodV)
05-07 12:45:30.676:W/dalvikvm(363):未决异常为:
05-07 12:45:30.676:I/dalvikvm(363):Ljava/lang/RuntimeException;:无法在未调用Looper.prepare()的线程内创建处理程序
05-07 12:45:30.706:I/dalvikvm(363):位于android.os.Handler.(Handler.java:121)
05-07 12:45:30.706:I/dalvikvm(363):在android.widget.Toast.(Toast.java:68)
05-07 12:45:30.706:I/dalvikvm(363):在android.widget.Toast.makeText(Toast.java:231)上
05-07 12:45:30.706:I/dalvikvm(363):位于org.example.android.applicationdemo.ApplicationDemoActivity.onExecute(ApplicationDemoActivity.java:130)
05-07 12:45:30.706:I/dalvikvm(363):位于org.example.android.applicationdemo.applicationDeactivity$2.execute(applicationDeactivity.java:100)
05-07 12:45:30.706:I/dalvikvm(363):在org.example.android.servicedemo.IServiceCallback$Stub.onTransact(IServiceCallback.java:55)
05-07 12:45:30.706:I/dalvikvm(363):在android.os.Binder.execTransact(Binder.java:320)
05-07 12:45:30.706:I/dalvikvm(363):在dalvik.system.NativeStart.run运行(本机方法)
05-07 12:45:30.706:I/dalvikvm(363):“粘合剂螺纹#2”prio=5 tid=8本机螺纹
05-07 12:45:30.706:I/dalvikvm(363):| group=“main”scont=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)
05-07 12:45:30.714:I/dalvikvm(363):在dalvik.system.NativeStart.run运行(本机方法)
05-07 12:45:30.714:E/dalvikvm(363):VM正在中止

我认为您可以在非UI线程上执行的方法中创建处理程序。 将处理程序设置为全局变量

private Handler _handler = new Handler();

伟大的我刚刚在
onExecute
方法中使用了
\u handler.post(new Runnable(){…})
,现在它工作正常了!