gpt4 book ai didi

android - 我可以在服务中使用 SpiceManager 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:22 25 4
gpt4 key购买 nike

我正在尝试将 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
}

这会在服务启动后立即给我该类转换异常吗?

最佳答案

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

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

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

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

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

非常抱歉,您不能在此项目中使用 RoboSpice。如果您找到解决方法,我很想听取您的意见,但我认为这是不可能的,因为 Android 本身的设计。

关于android - 我可以在服务中使用 SpiceManager 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19863436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com