有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java意图。putExtras(字符串键、消息对象)抛出无法跨进程封送不可传递的对象

这是我默认活动中的WebChromeClient

@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
    Intent intent = new Intent(mActivty, PopUpActivity.class);
    intent.putExtra("MESSAGE", resultMsg);
    mActivity.startActivity(intent);
    return true;

这就是我在PopUpActivity中的处理方式:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_webpage);

    getWindow().setBackgroundDrawable(null);

    mCloseButton = (ImageButton) findViewById(R.id.close_button);

    // we don't care about getting a warmed webview in this case, just create a new one
    mWebView = WebViewConstructor.constructWebView(this);

    mWebViewContainer = (RelativeLayout) findViewById(R.id.webview_container);

    // add the webview to the container layout
    WebViewManager.attachWebViewToParentContainer(mWebView, mWebViewContainer);
    Intent intent = getIntent();
    if (intent.getExtras() != null) {
        Message resultMsg = intent.getExtras().getParcelable("MESSAGE");
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(mWebView);
        resultMsg.sendToTarget();
}

基本上,我想通过WebView。作为ResultMg传入的WebViewTransport。obj指向PopUpActivity,以便他可以构造webview并处理消息。但是,我得到了这个错误,是由行引起的 intent.putExtra("MESSAGE", resultMsg)

Can't marshal non-Parcelable objects across processes.

即使ResultMg是一个实现Parcelable的消息类

我错过了什么


共 (1) 个答案

  1. # 1 楼答案

    根据您的代码,您可以使用intent.getExtras()来获取值。而且intent.getExtras()的返回值是Bundle,所以您应该使用Bundle来传输数据

    改变

    Intent intent = new Intent(mActivty, PopUpActivity.class);
    intent.putExtra("MESSAGE", resultMsg);
    mActivity.startActivity(intent);
    

     Intent intent = new Intent(mActivty, PopUpActivity.class);
     Bundle bundle = new Bundle();
     bundle.putParcelable("MESSAGE", resultMsg);
     intent.putExtras(bundle);
     mActivity.startActivity(intent);
    

    另一种方式

    使用intent.putExtra来传输Message,而MessageParcelable。因此,您可以使用intent.getParcelableExtra来获取值

    改变

    Intent intent = getIntent();
    if (intent.getExtras() != null) {
        Message resultMsg = intent.getExtras().getParcelable("MESSAGE");
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(mWebView);
        resultMsg.sendToTarget();
    

    Intent intent = getIntent();
    Message resultMsg = intent.getParcelableExtra("MESSAGE")
    WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
    transport.setWebView(mWebView);
    resultMsg.sendToTarget();
    

    注意

    • 如果使用Bundle传输数据,则必须使用Bundle获取数据并进行处理

    • 如果使用普通的putExtra方法来传输数据,那么可以使用相应的get方法来获取数据