2013-08-10 13 views
9

Il mio collega e io stiamo vivendo un comportamento molto strano con un oggetto Android Canvas.Errore di segnale fatale Android 11 SIGSEGV su diverse versioni di JellyBean

Abbiamo a che fare con un oggetto canvas inizializzato e sono in modo selettivo ottenendo un errore irreversibile 11 Errore tra 2 tablet Nexus 7; uno dei quali esegue 4.2.2 e funziona bene, e l'altro che esegue 4.3 e si blocca. Stiamo cercando di capire come risolvere il problema che consiste nel determinare se l'errore è da parte nostra o in qualche modo un problema tecnico nell'API di Android (improbabile).

L'errore si verifica quando si tenta di chiamare canvas.getWidth() sull'oggetto. Codice

nostro Java: (non che probabilmente conta, ma Rect è dalla nostra base di codice, non è un android.graphics.Rect)


public Rect getViewportBounds() { 
    Canvas can = _diagram._canvas; 
    Rect vb = _viewportBounds; 
    if (can == null) return vb; 
    Point pos = _position; 
    int[] approxWindowVals = { (int) pos.getX(), (int) pos.getY() }; 
    double sc = _scale; 
    vb._set(approxWindowVals[0], approxWindowVals[1], Math.max(can.getWidth(), 0)/sc, Math.max(can.getHeight(), 0)/sc); 
    return vb; 
} 

Le nostre informazioni da LogCat è qui

 
08-09 16:49:14.883: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during layout: running second layout pass 
08-09 16:49:14.893: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during second layout pass: posting in next frame 
08-09 16:49:14.923: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during layout: running second layout pass 
08-09 16:49:14.943: D/abc(4083): onDraw 
08-09 16:49:14.943: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during second layout pass: posting in next frame 
08-09 16:49:14.973: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during layout: running second layout pass 
08-09 16:49:14.983: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during second layout pass: posting in next frame 
08-09 16:49:15.003: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during layout: running second layout pass 
08-09 16:49:15.033: A/libc(4083): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 4083 (egressiontester) 

Le nostre configurazioni hardware sono le seguenti:

 
+---------+------------+-----------------------+ 
| Tablet | Android OS |  Reached Error  | 
+---------+------------+-----------------------+ 
| Nexus 7 | 4.2.2  | NO     | 
| Nexus 7 | 4.3  | YES     | 
+---------+------------+-----------------------+ 

Se avete qualche idea sul motivo per cui ciò accade, fatemelo sapere. Potremmo dover ristrutturare la tela, ma siamo entrambi piuttosto confusi che una classe tanto comune come Canvas si sta comportando diversamente su due tablet identici.

La ringrazio molto per il vostro sostegno :)

+2

Usi il canvas con accelerazione hardware? Hai provato a accendere/spegnere l'accelerazione hardware? –

+0

@ AndrzejDuś, l'accelerazione hardware è stata inizialmente disattivata e attivandola ** ha ** risolto il problema, tuttavia stiamo sviluppando una libreria di classi e quindi dobbiamo scrivere il codice per il maggior numero possibile di utenti e casi d'uso. –

risposta

1

Non esegue il rendering sul secondo passaggio di layout se il flag modificato è falso risolto questo problema per me.

+0

Benvenuto in Stack Overflow! Per favore non aggiungere "grazie" come risposta. Investi un po 'di tempo nel sito e otterrai sufficienti [privilegi] (http://stackoverflow.com/privileges) per sviare le risposte che ti piacciono, che è il modo di Overflow dello stack di dire grazie. –

0

Abbiamo risolto questo problema semplicemente assegnando il nostro oggetto Canvas su null dopo l'uso. Sotto il cofano, probabilmente l'API di Android è stata reinizializzata con un indirizzo valido valido.

Il problema è stato risolto, ma il fatto che il problema degli indirizzi sia stato risolto implicitamente in 4.2.2 e non in 4.3 è probabilmente un bug e dovrebbe essere ulteriormente studiato.

+0

Se pensi che sia un bug in Android, segnalalo sul bug tracker Android. In questo momento, sei l'unico che può fare ulteriori ricerche: nessun altro ha lo stesso codice o istruzioni da riprodurre. –

+0

Non è un bug. Non dovresti tenere un riferimento a un 'Canvas'. Inoltre, probabilmente non dovresti usare 'Canvas.getWidth' dato che ha un significato diverso a seconda che si tratti di una vista con accelerazione hardware o meno (dimensione finestra piena vs solo dimensioni vista) – Delyan