3

В одном из моего класса, у меня есть метод, называемый getResultReceiver() который создал экземпляр ResultReceiver:ClassNotFoundException когда получают Parcelable данные широковещательного намерения

public class MyTask { 

    ResultReceiver resultReceiver; 

    public ResultReceiver getResultReceiver() { 
      resultReceiver = new ResultReceiver(new Handler()) { 
       @Override 
        protected void onReceiveResult(int resultCode, Bundle resultData) { 
            … 
        } 
      } 
      return resultReceiver; 
    } 
} 

Я посылаю широковещательного намерения с выше ResultReceiver, например, как дополнительный данные:

Intent intent = new Intent(“my.result.receiver.action”); 
intent.putExtra(“my-result-receiver", getResultReceiver()); 
context.sendBroadcast(intent); 

Все выше код работает в другой поток, чем основной поток, то MyTask конкретизируется с помощью service работает в отдельном процессе.

В моем основном активности класса, у меня есть приемник вещания для выше широковещательного намерения:

BroadcastReceiver myReceiverInActivity = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.i(“MyApp”, "Reveived broadcast "); 
      //Here, I got ClassNotFoundException when unmarshalling : com/xyz/MyTask$1 
      ResultReceiver resultReceiver 
           = intent.getParcelableExtra("my-result-receiver"); 
     } 

    }; 

Когда я запускаю мое приложение, я могу видеть журнал «Полученных вещать», но я также получил ClassNotFoundException:

FATAL EXCEPTION: main 
E/AndroidRuntime(2649): java.lang.RuntimeException: Error receiving broadcast Intent { act=my.result.receiver.action flg=0x10 (has extras) } in [email protected] 
E/AndroidRuntime(2649): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:882) 
E/AndroidRuntime(2649): at android.os.Handler.handleCallback(Handler.java:739) 
E/AndroidRuntime(2649): at android.os.Handler.dispatchMessage(Handler.java:95) 
E/AndroidRuntime(2649): at android.os.Looper.loop(Looper.java:211) 
E/AndroidRuntime(2649): at android.app.ActivityThread.main(ActivityThread.java:5373) 
E/AndroidRuntime(2649): at java.lang.reflect.Method.invoke(Native Method) 
E/AndroidRuntime(2649): at java.lang.reflect.Method.invoke(Method.java:372) 
E/AndroidRuntime(2649): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
E/AndroidRuntime(2649): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 
E/AndroidRuntime(2649): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.xyz.MyTask$1 
E/AndroidRuntime(2649): at android.os.Parcel.readParcelableCreator(Parcel.java:2326) 
E/AndroidRuntime(2649): at android.os.Parcel.readParcelable(Parcel.java:2276) 
E/AndroidRuntime(2649): at android.os.Parcel.readValue(Parcel.java:2183) 
E/AndroidRuntime(2649): at android.os.Parcel.readArrayMapInternal(Parcel.java:2516) 
E/AndroidRuntime(2649): at android.os.BaseBundle.unparcel(BaseBundle.java:221) 
E/AndroidRuntime(2649): at android.os.Bundle.getParcelable(Bundle.java:755) 
E/AndroidRuntime(2649): at android.content.Intent.getParcelableExtra(Intent.java:5089) 
E/AndroidRuntime(2649): at com.xyz.MainActivity$8.onReceive(MainActivity.java:874) 
E/AndroidRuntime(2649): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:872) 

Почему я получил эту ClassNotFoundException, что указывает на MyTask класс? как его решить?

===== UPDATE ======

Я попытался ответить @Samuel «s, сделал публичный класс с именем MyResultReceiver, теперь исключение составляет почти то же самое, но вместо $1, он показывает MyResultReceiver:

ClassNotFoundException when unmarshalling: com.xyz.MyTask.MyResultReceiver 
... 

ответ

0

2 Идеи -

1- прописали вы свой вещательный приемник.

2- Попробуйте использовать метод onNewIntent().

+0

1. Я зарегистрировался, иначе я не могу видеть журнал, о котором я упоминал. – user842225

0

BroadcastReceiver получение намерения происходит в отдельном процессе от отправителя намерения, правильно? Если это правда, у него не будет доступа к вашему классу, потому что он имеет свой собственный загрузчик классов. Следовательно, ClassNotFoundException. Вы должны убедиться, что оба процесса имеют доступ к файлу MyResultReceiver .class в своем APK.

+0

Итак, если я передаю экземпляр MyResultReceiver через IPC (AIDL) вместо широковещательного приемника, может ли это быть решением? – user842225

+0

Я не думаю, что изменение транспортного протокола изменит что-либо. Проблема заключается в том, что на принимающей стороне он не имеет доступа к файлу .class, в котором установлен MyResultReceiver. Я бы создал общий файл .jar, поместил MyResultReceiver в общий .jar и включил файл .jar в обоих процессы. – Samuel

+0

Или вы можете перепроектировать и попытаться передать * данные * вместо объекта Java – Samuel

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