屏幕旋转后无法从新的 ResultReceiver 修改 UI



我非常绝望。情况就是这样:我有一项活动和一项服务。从服务到活动的通信依赖于一个非常简单的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()
    }
}

一切正常:活动接收异步消息并成功更新UI。但如果我旋转屏幕,我就会失去连接:我知道"旧的"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,所以我相信这会在配置更改后发生),当我尝试发送东西时,我会获得一个nullpointereException,所以我猜它实际上会得到更新(即从新活动中获得"新"ResultReceiver)。

我不想"保存"旧的ResultReceiver,并在重新创建活动时"重新布线"它;我可以创建一个新的ResultReceiver,并将其传递给服务onRebind(),后者将更新其。但它不起作用。

在屏幕旋转和重新绑定之后,"新"ResultReceiver的onReceiveResult()无法访问UI——它更改的内容不会显示。我不知道在哪里可以找到错误:在屏幕旋转之前,一切都正常,所以我想它一定与服务有关,它引用了一些旧的东西。

请参阅以下答案:https://stackoverflow.com/a/23059313/3075340

你必须实现一个接口,但如果你实现了,你的UI就会发生变化。

相关内容

  • 没有找到相关文章

最新更新