Невозможно изменить пользовательский интерфейс из нового ResultReceiver после поворота экрана

Я в отчаянии. Вот такая ситуация: у меня есть активность и услуга. Связь между сервисом и активностью зависит от довольно простого ResultReceiver.

public class ServiceReceiver extends ResultReceiver {
    public ServiceReceiver(android.os.Handler handler) {
        super(handler);
    }

    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
         //do stuff, update UI using runOnUIThread()
    }
}

Все работает нормально: активность получает асинхронные сообщения и успешно обновляет пользовательский интерфейс. Но если я поворачиваю экран, я теряю связь: я знаю, что "старый" ResultReceiver потерян и меня это устраивает, дело в том, что я создаю и отправляю в сервис новый. Я делаю это при создании:

    Intent sIntent = new Intent(this, ConnectionService.class);
    serviceReceiver = new ServiceReceiver(new Handler());
    sIntent.putExtra("receiver", serviceReceiver);
    bindService(sIntent, mConnection, Context.BIND_AUTO_CREATE);

и обслуживание:

public void onRebind(Intent intent) {
    serviceReceiver = intent.getParcelableExtra("receiver");
    Log.e("SERVICE", "REBIND");
}

успешно печатает «REBIND» каждый раз, когда экран поворачивается. serviceReceiver - это место, куда я отправляю вещи: если я устанавливаю для него значение null onRebind (но не onStartCommand или onBind, поэтому я уверен, что это происходит после изменения конфигурации), я получаю исключение nullpointerexception, когда пытаюсь отправить вещи, так что я думаю, что на самом деле он получает обновлен (т.е. получает «новый» ResultReceiver из новой активности).

Я не хочу «сохранять» старый ResultReceiver и «перемонтировать» его при воссоздании активности; Я согласен создать новый ResultReceiver и передать его службе onRebind(), которая обновит его. Но это не работает.

После поворота экрана и повторной привязки onReceiveResult() "нового" ResultReceiver не может получить доступ к пользовательскому интерфейсу - то, что он изменяет, не отображается. Я не знаю, где искать ошибку: все работает, пока экран не повернут, так что это должно быть связано с сервисом, содержащим ссылку на что-то старое, я думаю.


person user2502368    schedule 05.11.2014    source источник


Ответы (1)


См. этот ответ: https://stackoverflow.com/a/23059313/3075340

Вы должны реализовать интерфейс, но если вы это сделаете, ваш пользовательский интерфейс изменится.

person Micro    schedule 20.05.2016