我有一个名为‘支付通’的应用,它提供了aidl,可以是其他应用调用它的服务。我现在的问题是,如果我在远程服务的方法中使用了Toast.Text方法时就会报一下的错误11-15 13:25:12.338: E/JavaBinder(4410): *** Uncaught remote exception!  (Exceptions are not yet supported across processes.)
11-15 13:25:12.338: E/JavaBinder(4410): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
11-15 13:25:12.338: E/JavaBinder(4410):  at android.os.Handler.<init>(Handler.java:197)
11-15 13:25:12.338: E/JavaBinder(4410):  at android.os.Handler.<init>(Handler.java:111)
11-15 13:25:12.338: E/JavaBinder(4410):  at android.widget.Toast$TN.<init>(Toast.java:324)
11-15 13:25:12.338: E/JavaBinder(4410):  at android.widget.Toast.<init>(Toast.java:91)
11-15 13:25:12.338: E/JavaBinder(4410):  at android.widget.Toast.makeText(Toast.java:238)
11-15 13:25:12.338: E/JavaBinder(4410):  at com.zyt.remoteservice.PlayService.playfollow(PlayService.java:41)
11-15 13:25:12.338: E/JavaBinder(4410):  at com.zyt.remoteservice.PlayService.access$0(PlayService.java:39)
11-15 13:25:12.338: E/JavaBinder(4410):  at com.zyt.remoteservice.PlayService$MyBinder.play(PlayService.java:35)
11-15 13:25:12.338: E/JavaBinder(4410):  at com.zyt.remoteservice.IPlayService$Stub.onTransact(IPlayService.java:48)
11-15 13:25:12.338: E/JavaBinder(4410):  at android.os.Binder.execTransact(Binder.java:351)
11-15 13:25:12.338: E/JavaBinder(4410):  at dalvik.system.NativeStart.run(Native Method)我想知道为什么远程调用服务的时候不能在服务中使用Toast.Text。为什么本地应用中调用Service的方法的时候,方法体中可以使用Toast.Text。Android Service远程服务

解决方案 »

  1.   

    Can't create handler inside thread that has not called Looper.prepare()
    这个意思是很明显,
    子线程是没有消息队列的,需要这样写:new Thread(){
      public void run(){
        Looper.prepare();
        myLooper = Looper.myLooper();
        Looper.loop();
      }
    }.start();
    把上面的myLooper传给handlerHandler handler = new MyHandler(myLooper);
      

  2.   

    原因是不在主线程,需要用线程通讯的方法到主线程中进行操作,具体方法是:
    1 在 onCreate 方法就是主线程中新建一个 Handler,并实现 
    2 在子线程中发送消息给第一步的对象发送一个消息,可以附带相关数据
       
    h = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);
    switch(msg.what) {
    case 0:
    Toast.makeText(c, msg.obj.toString(), Toast.LENGTH_LONG).show();
    break;
    } }
    };
    Message msg = new Message();
    msg.what = 0;
    msg.obj = "show text";
    h.sendMessage(msg);