2017-12-12 71 views
0

에서 비 Parcelable 객체를 마샬링 할 수 없습니다 던졌습니다 내 WebChromeClient 내 기본 활동 :intent.putExtras (문자열 키, 메시지 객체) 이것은 프로세스

@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를 구성하고 메시지를 처리 ​​할 수 ​​있도록 resultMsg.obj를 PopUpActivity에 전달한 WebView.WebViewTransport를 전달하고 싶습니다. 그러나, 나는 선 intent.putExtra("MESSAGE", resultMsg)로 인한이 오류를 얻을 :

Can't marshal non-Parcelable objects across processes. 

resultMsg는 Parcelable을 구현하는 메시지 클래스는 비록?

무엇이 여기에 있습니까?

답변

1

은 당신의 코드에 따라, 당신은 가치 .And intent.getExtras()의 반환은 Bundle입니다 얻을 intent.getExtras()를 사용, 그래서 당신은 데이터를 전송하는 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); 

또 다른 방법

당신은 Message를 전송하는 intent.putExtra을 사용하고이 값을 얻기 위해 intent.getParcelableExtra을 사용할 수 있습니다 낭포 MessageParcelable입니다합니다.

변경

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(); 

데이터를 전송하는 Bundle를 사용하는 경우 주

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

    , 당신은 데이터를 얻을 수 Bundle를 사용해야하며 처리합니다.

  • 일반적인 putExtra 메서드를 사용하여 데이터를 전송하는 경우 해당 get 메서드를 사용하여 데이터를 가져올 수 있습니다. 불일치를 몰래위한

+0

감사합니다 .. 당신은 내가'Message'를 전송하는'intent.putExtra'를 사용하기 위해 노력하고있어, 그것이 원래에 그대로'Message'이 ('Parcelable'입니다 언급 한 바와 같이 암호). 그러나,'intent.putExtra ("MESSAGE", resultMsg);를 시도하면 에러가 발생한다.'resultMsg'는 Message 객체 임에도 불구하고 Parcelable이 아니라고 말하고있다. – byInduction

+0

두 가지 방법으로 시도 할 수 있습니다. – KeLiuyue

+0

두 번째 방법을 시도했지만 여전히 '프로세스간에 비소 거할 수없는 객체를 마샬링 할 수 없음'오류 : 의도 Intent = new Intent (mActivity, PopUpActivity.class); 번들 번들 = 새 번들(); bundle.putParcelable ("MESSAGE", resultMsg); 의도입니다.putExtras (번들); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); mActivity.startActivity (intent);' – byInduction