ResultReceiver无法继续进行屏幕旋转

Mat*_*ska 5 rest service android

我正在Android中实现REST客户端.我已经看到了使用a Service来执行与服务器的连接以及ResultReceiver被通知操作完成的示例.我从片段调用服务,如果我在服务运行时尝试旋转屏幕,则getActivity()方法ResultReceiver返回null,因为该片段可能不再处于布局中.

片段中的回调方法:

@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
    Response response = (Response) resultData
            .getSerializable(RestService.RESULT);
    if (resultCode == RestService.SUCCESS
            && response != null) {
        if (getActivity() != null) {
            recommendationResponse = response;
            getLoaderManager().restartLoader(0, new Bundle(),
                    Fragment.this);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

getActivity()返回null.这是正常的吗?我可以使用什么方法在屏幕旋转时允许通知?本地广播?

bly*_*roi 12

没有,

android:configChanges="orientation"
Run Code Online (Sandbox Code Playgroud)

不是解决方案.

要使用ResultReceiver I:

  • 将其保存在方向更改上:

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putParcelable(Consts.RECEIVER, mReceiver);
        super.onSaveInstanceState(outState);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 重置接收器:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    
        if (savedInstanceState != null) {
            mReceiver = savedInstanceState.getParcelable(Consts.RECEIVER);
        }
        else {
            mReceiver = new MyResultReceiver(new Handler());
        }
        mReceiver.setReceiver(this);
    }
    
    Run Code Online (Sandbox Code Playgroud)

这是我的ResultReceiver类:

import android.os.Bundle;
import android.os.Handler;
import android.os.ResultReceiver;

public class MyResultReceiver extends ResultReceiver {
    private Receiver mReceiver;

    public MyResultReceiver(Handler handler) {
        super(handler);
    }

    public void setReceiver(Receiver receiver) {
        mReceiver = receiver;
    }

    public interface Receiver {
        public void onReceiveResult(int command, Bundle resultData);
    }

    @Override
    protected void onReceiveResult(int command, Bundle resultData) {
        if (mReceiver != null) {
            mReceiver.onReceiveResult(command, resultData);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @MicroR我猜这是因为在旋转时,Bundle不会被序列化为Parcel,它会保留在内存中,因此您可以将原始对象退出.如果应用程序被终止(内存压力),Bundle可能会变成一个Parcel,这是您遇到重新解压缩对象的问题,因为Parcel只会返回一个基础ResultReceiver.我还没有找到一个好的解决方案. (4认同)

Mat*_*ska 1

我正在使用BroadcastReceiver注册使用LocalBroadcastManager并且它工作正常。事情没那么简单。是否存在更好的解决方案?