2013-11-08 4 views
4

Я пытаюсь прикрепить SpiceManager к службе, но я получаю:Можно ли использовать 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 
} 

Это дает мне, что исключение класса произнесения, как только как начинается сервис?

+0

Действительно странно. Вы можете использовать SpiceManager в любом контексте. Не могли бы вы указать вашу версию RS и полный стек, пожалуйста. – Snicolas

+0

Моя версия RS 1.4.9, minSdkVer 15, targetSdkVer 17 – canni

+0

Хорошо, а трассировка стека? – Snicolas

ответ

6

Чтобы использовать RoboSpice, сущность (контекст) с использованием SpiceManager и SpiceService должны жить в том же процессе.

RoboSpice действует как мост между службой Android и любым другим контекстом. И этот мост является объектно-ориентированным, позволяющим двунаправленный канал связи на основе объектов между контекстом и сервисом.

Это возможно на Android в одном единственном состоянии: SpiceService и сущность, использующие SpiceManager, должны жить в этом процессе. Этот особый «трюк» - это жесткое кодированное поведение в Android, называемое «Локальная привязка к сети».

Если это условие не выполняется, невозможно связать службу RS правильно. Когда SpiceManager будет привязан к SpiceService, он получит BinderProxy, с которым невозможно обмениваться ссылками: все коммуникации должны быть основаны на Bundles, сериализуемых или пакетных объектах. В таком состоянии RS вообще не работает.

Я посмотрел ваш проект на https://github.com/rovo89/XposedBridge/blob/master/src/de/robv/android/xposed/XposedBridge.java, и похоже, что вы играете с довольно низким уровнем вещей в нем и запускаете новые процессы Zygote оттуда. Я предполагаю, что процессы, которые вы создаете с помощью fory zygote, не будут находиться в том же процессе, что и сам SpiceService, вот почему вы получаете это исключение.

Мне очень жаль это говорить, но вы не можете использовать RoboSpice в этом проекте. Если вы когда-нибудь найдете обходной путь, мне было бы очень интересно услышать от вас, но я не думаю, что это будет возможно, по дизайну самого Android.

+0

XposedBridge (и Xposed framework) это не мой проект, это всего лишь часть программного обеспечения, установленного на моем (пользовательском) ROM - и я получаю такое же поведение на складе ROM до – canni

+0

Но вы, где правильно, я пытался использовать один SpiceService для все мои действия/услуги, где один из них, где в разных процессах. Thx за терпение, и помогите :) – canni

-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()); 
     } 
    } 
+0

Неправильно, вы можете сделать это с помощью RS. Для этого есть даже образцы. – Snicolas

Смежные вопросы