2016-09-16 3 views
0

React Nativeによってトリガーされた次のエラーが発生しました。私はかなり私は使用しているカスタムビューにリンクされていると確信しています。対応するネイティブ例外:指定された子にはすでに親があります。

ビューは、OpenGLを介してViewGroupに追加され、その後リアクションネイティブビューに組み込まれたいくつかのC++コードによって生成されます。アプリが初めて読み込まれたときには、すべて正常です。しかし、いくつかのデータが変更された場合、Reactはビューを再読み込みし、ビューの新しいインスタンスを作成したいようです。私は、ビューが親を持っているかどうかをチェックしています。そうであれば、ビューを返す前にそれを削除します。ただし、ユーザーが新しいデータを選択した後、ビューが更新されようとしているときと同様に、クラッシュが発生します。

public class ReactJuceViewManager extends SimpleViewManager<JuceViewHolder> { 

    public static final String REACT_CLASS = "ReactJuceView"; 
    private ReactApplicationContext reactContext; 

    public ReactJuceViewManager(ReactApplicationContext reactContext) 
    { 
     super(); 
     this.reactContext = reactContext; 
    } 

    @Override 
    public String getName() 
    { 
     return REACT_CLASS; 
    } 

    @Override 
    protected JuceViewHolder createViewInstance(ThemedReactContext themedReactContext) { 

     JuceBridge juceBridge = JuceBridge.getInstance(); 
     //JuceBridge manages the a HashMap of `JuceViewHolder`s, never deleting them once created 

     Log.d("ReactJuceViewManager", "createViewInstance"); 
     JuceViewHolder v = juceBridge.getViewForComponent("Tuner", themedReactContext); 

     Log.d("JuceViewHolder", v.getTag().toString()); 
     ViewGroup parent = (ViewGroup) v.getParent(); 
     if (parent != null) 
     { 
      Log.d("ReactJuceViewManager", "JuceViewHolder parent: " + v.getParent().toString()); 
      // Remove from parent 
      Log.i("ReactJuceViewManager", "Removing JuceViewHolder instance from previous parent"); 
      parent.removeView(v); 
     } 
     else 
     { 
      Log.d("ReactJuceViewManager", "JuceViewHolder parent: null"); 
     } 

     return v; 
    } 

} 

...とここでスタックトレースです:

ViewManagerコードは次のとおりです

E/unknown:React: Exception in native call from JS 
                     java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
                      at android.view.ViewGroup.addViewInner(ViewGroup.java:4309) 
                      at android.view.ViewGroup.addView(ViewGroup.java:4145) 
                      at android.view.ViewGroup.addView(ViewGroup.java:4086) 
                      at com.facebook.react.views.view.ReactViewManager.addView(ReactViewManager.java:196) 
                      at com.facebook.react.views.view.ReactViewManager.addView(ReactViewManager.java:39) 
                      at com.facebook.react.uimanager.NativeViewHierarchyManager.manageChildren(NativeViewHierarchyManager.java:384) 
                      at com.facebook.react.uimanager.UIViewOperationQueue$ManageChildrenOperation.execute(UIViewOperationQueue.java:175) 
                      at com.facebook.react.uimanager.UIViewOperationQueue$2.run(UIViewOperationQueue.java:782) 
                      at com.facebook.react.uimanager.UIViewOperationQueue.flushPendingBatches(UIViewOperationQueue.java:829) 
                      at com.facebook.react.uimanager.UIViewOperationQueue.access$1500(UIViewOperationQueue.java:44) 
                      at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded(UIViewOperationQueue.java:868) 
                      at com.facebook.react.uimanager.GuardedChoreographerFrameCallback.doFrame(GuardedChoreographerFrameCallback.java:32) 
                      at com.facebook.react.uimanager.ReactChoreographer$ReactChoreographerDispatcher.doFrame(ReactChoreographer.java:131) 
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:856) 
                      at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                      at android.view.Choreographer.doFrame(Choreographer.java:603) 
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

答えて

0

私はコンポーネントにどのようにJuceBridge店舗の参照を変更 - ComponentPeerView Sを保存する代わりに、 Viewであり、これはJuceViewHolderです。

(私のfork of JUCEを参照してください)

私はその後、私の問題を解決しComponentPeerViewの親アクセス:

protected ReactJuceView createViewInstance(ThemedReactContext themedReactContext) { 
    JuceBridge juceBridge = JuceBridge.getInstance(); 
    juceBridge.setActivityContext(themedReactContext); 

    ReactJuceView v = new ReactJuceView(themedReactContext); 

    JuceBridge.ComponentPeerView componentPeerView = juceBridge.getPeerViewForComponent("MainComponent"); 
    if (componentPeerView != null) { 

     Log.d ("ReactJuceViewManager", "Got componentPeerView"); 
     ViewGroup parent = (ViewGroup) componentPeerView.getParent(); 
     if (parent != null) { 

      parent.removeView(componentPeerView); 
     } 
     v.addView(componentPeerView); 
     Log.d("ReactJuceViewManager", "About to attachOpenGlContext"); 
     MainActivity.attachOpenGLContext("MainComponent"); 
    } 
    else 
     Log.d("ReactJuceViewManager", "componentPeerView is null"); 

    return v; 
} 
関連する問題