4

我正在尝试将 a 附加SpiceManager到服务,但我得到:

java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.octo.android.robospice.SpiceService$SpiceServiceBinder
        at com.octo.android.robospice.SpiceManager$SpiceServiceConnection.onServiceConnected(SpiceManager.java:1072)
        at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java)
        at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java)
        at android.os.Handler.handleCallback(Handler.java)
        at android.os.Handler.dispatchMessage(Handler.java)
        at android.os.Looper.loop(Looper.java)
        at android.app.ActivityThread.main(ActivityThread.java)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)
        at dalvik.system.NativeStart.main(Native Method)

服务流程看起来有点像这样:

class MyService extends Service {
    // ...
    SpiceManager mSpiceManager = new SpiceManager(UncachedSpiceService.class);
    // ...

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mSpiceManager.start(this);
        mSpiceManager.execute(new MyRequest(), new RequestListener<String>() {
            // Handle of request
        })
        // ...
        return START_STICKY;
    }

    // + additional calls to mSpiceManager.execute() in other methods
}

这给了我服务启动后的类转换异常?

4

2 回答 2

6

要使用 RoboSpice,使用 SpiceManager 的实体(上下文)和 SpiceService 必须位于同一进程中。

RoboSpice 就像 Android 服务和任何其他上下文之间的桥梁。这个桥是面向对象的,允许在上下文和服务之间建立一个基于对象的双向通信通道。

这在 Android 上只有一个条件是可能的:SpiceService 和使用 SpiceManager 的实体必须存在于进程中。这个非常特殊的“技巧”是 Android 中的一种硬编码行为,称为“本地服务绑定”。

如果这个条件不成立,就不可能以正确的方式绑定到 RS 服务。当 SpiceManager 绑定到 SpiceService 时,它​​会收到一个不能与之共享引用的 BinderProxy:所有通信都必须基于 Bundle、可序列化或可打包对象。在这种情况下,RS 根本无法工作。

我在https://github.com/rovo89/XposedBridge/blob/master/src/de/robv/android/xposed/XposedBridge.java上查看了您的项目,看起来您在玩非常低级的东西,并从那里启动新的 Zygote 进程。我假设您通过分叉 zygote 创建的进程不会与 SpiceService 本身位于同一进程中,这就是您收到此异常的原因。

我很抱歉这么说,但你不能在这个项目中使用 RoboSpice。如果您找到解决方法,我会很高兴收到您的来信,但我认为这不可能,因为 Android 本身的设计。

于 2013-11-12T05:46:00.283 回答
-1

您不能从后台线程调用后台服务/线程。

你可以像这样实现它。

public void callService() {
        try {
            org.springframework.web.client.RestTemplate rt = new org.springframework.web.client.RestTemplate();
            rt.getMessageConverters().add(
                    new MappingJacksonHttpMessageConverter());
            String url = "xyz";

            Contacts contacts = rt.postForObject(url, body,
                    Contacts.class);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, "Called-" + e.toString());
        }
    }
于 2013-11-11T13:28:23.507 回答