2014-10-26 10 views
7

Negli ultimi giorni ho iniziato a ricevere l'errore sopra.
Non qui e là, ma ovunque. e in posti in cui non riesco nemmeno a mettere questo strano costruttore, come lo stack di chiamate qui sotto.Nessun costruttore trovato per ... (System.IntPtr, Android.Runtime.JniHandleOwnership)

Ho visto la risposta in https://stackoverflow.com/a/10603714/106248 ma credo che questo non sia il mio caso. Semplicemente ha iniziato ad accadere ovunque. soprattutto quando inserisco un breakpoint.

Ecco un esempio:

10-26 15:34:58.895 E/mono-rt (13841): [ERROR] FATAL UNHANDLED EXCEPTION: System.NotSupportedException: Unable to activate instance of type Android.Views.View+IOnClickListenerImplementor from native handle 7960001d ---> System.MissingMethodException: No constructor found for Android.Views.View+IOnClickListenerImplementor::.ctor(System.IntPtr, Android.Runtime.JniHandleOwnership) ---> Java.Interop.JavaLocationException: Exception of type 'Java.Interop.JavaLocationException' was thrown. 
10-26 15:34:58.895 E/mono-rt (13841): Java.Lang.Error: Exception of type 'Java.Lang.Error' was thrown. 
10-26 15:34:58.895 E/mono-rt (13841): 
10-26 15:34:58.895 E/mono-rt (13841): --- End of managed exception stack trace --- 
10-26 15:34:58.895 E/mono-rt (13841): java.lang.Error: Java callstack: 
10-26 15:34:58.895 E/mono-rt (13841): at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method) 
10-26 15:34:58.895 E/mono-rt (13841): at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29) 
10-26 15:34:58.895 E/mono-rt (13841): at android.view.View.performClick(View.java:4475) 
10-26 15:34:58.895 E/mono-rt (13841): at android.view.View$PerformClick.run(View.java:18786) 
10-26 15:34:58.895 E/mono-rt (13841): at android.os.Handler.handleCallback(Handler.java:730) 
10-26 15:34:58.895 E/mono-rt (13841): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-26 15:34:58.895 E/mono-rt (13841): at android.os.Looper.loop 
+0

Hai trovato la soluzione? –

risposta

5

Da quello che ho vissuto, questo può succedere quando un oggetto viene rilasciato dalla memoria mentre l'applicazione è in esecuzione. Quindi, ad esempio, se si torna a quella pagina e l'oggetto deve essere ricreato da Mono, è necessario specificare tale costruttore.

John Pryoranswer you are referring to dovrebbe essere la risposta al tuo problema. La parte importante è la seguente:

Così Mono per Android crea un'istanza del tipo appropriato ... via il costruttore (IntPtr, JniHandleOwnership), e genera un errore se questo costruttore non può essere trovato.

Una volta che la (in questo caso) costruttore TextView termina l'esecuzione, costruttore ACW il del LogTextBox eseguirà, a quel punto Mono per Android andrà "aha! Abbiamo già creato un'istanza di C# per questo esempio Java" e invocherà quindi il costruttore appropriato su l'istanza già creata. Ciò significa che per una singola istanza verranno eseguiti due costruttori : il costruttore (IntPtr, JniHandleOwnership) e (successivamente) il costruttore (Context, IAttributeSet, int) .

Mi piacerebbe essere un aiuto migliore, ma senza alcun frammento di codice è difficile dirlo. Prova a cercare nell'oggetto che implementa il IOnClickListenerImplementor vedi se riesci ad aggiungere il costruttore nell'implementazione del listener .... Buona fortuna

+2

3 anni dopo, sto affrontando il problema. E questo segmento di documenti del sito di Xamarin ha aiutato - __Premature Dispose() Chiamate Esiste una mappatura tra un handle JNI e l'istanza C# corrispondente. Java.Lang.Object.Dispose() interrompe questa mappatura. Se un handle JNI inserisce il codice gestito dopo che il mapping è stato interrotto, sembra che l'attivazione di Java e il costruttore (IntPtr, JniHandleOwnership) vengano controllati e invocati. Se il costruttore non esiste, verrà generata un'eccezione .__ https://developer.xamarin.com/guides/android/under_the_hood/architecture/#Premature_Dispose()_Calls – Dibzmania

+0

@Dibzmania Buoni risultati! – ForceMagic

+1

FYI - Colgo anche questo e ho imparato che se questo costruttore viene ricercato, qualcosa è molto sbagliato. Nel mio caso, ho avuto una copia locale che in qualche modo ha annullato la versione base di IntPtrHandle, in questo modo: Handle IntPtr pubblico {get; } ... rimuovendo quella proprietà ha permesso alla mappa di funzionare correttamente. Grazie a @Dibzmania per quel fantastico piccolo bocconcino. – outbred