Autore Topic: Problemi prima della visualizzazione di una bitmap  (Letto 780 volte)

Offline Andrew

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 11.04, Windows Xp
Problemi prima della visualizzazione di una bitmap
« il: 20 Settembre 2011, 20:41:41 CEST »
0
Ciao a tutti. Ho una classe MyView che estende View che all'interno del metodo onDraw(), prima di disegnare la Bitmap che occupa l'intero schermo, effettua alcune elaborazioni sulla bitmap stessa. Le elaborazioni sulla bitmap sono tali che l'immagine prima di essere visualizzata prende 6 secondi.
Il mio problema è il seguente: quando l'applicazione parte l'immagine non viene visualizzata subito perchè è in corso di elaborazione. Se però tocco lo schermo quando è nero (cioè quando ancora l'immagine deve essere visualizzata) la mia applicazione va in crash. Penso che il problema sia dovuto agli eventi di touch percepiti. Io però, non ho sovrascritto onTouchEvent dentro MyView. Se invece non tocco lo schermo prima della visualizzazione tutto funziona perfettamente (anche con successivi eventi di touch) Come posso risolvere il problema?
Vi posto il LogCat

Codice (Java): [Seleziona]
09-20 20:33:26.609: WARN/WindowManager(59): Key dispatching timed out sending to app.android/app.android.TestActivity
09-20 20:33:26.609: WARN/WindowManager(59): Previous dispatch state: {{KeyEvent{action=1 code=4 repeat=0 meta=0 scancode=158 mFlags=8} to Window{45051b00 app.android/app.android.TestActivity paused=false} @ 1316543376982 lw=Window{45051b00 app.android/app.android.TestActivity paused=false} lb=android.os.BinderProxy@4502f840 fin=false gfw=true ed=true tts=0 wf=false fp=false mcf=Window{45051b00 app.android/app.android.TestActivity paused=false}}}
09-20 20:33:26.619: WARN/WindowManager(59): Current dispatch state: {{null to Window{450f6398 app.android/app.android.TestActivity paused=false} @ 1316543606625 lw=Window{450f6398 app.android/app.android.TestActivity paused=false} lb=android.os.BinderProxy@450fe8a0 fin=false gfw=true ed=true tts=0 wf=false fp=false mcf=Window{450f6398 app.android/app.android.TestActivity paused=false}}}
09-20 20:33:26.818: INFO/Process(59): Sending signal. PID: 1091 SIG: 3
09-20 20:33:26.818: INFO/dalvikvm(1091): threadid=3: reacting to signal 3
09-20 20:33:27.047: INFO/Process(59): Sending signal. PID: 59 SIG: 3
09-20 20:33:27.047: INFO/dalvikvm(59): threadid=3: reacting to signal 3
09-20 20:33:27.190: INFO/dalvikvm(1091): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:27.489: INFO/Process(59): Sending signal. PID: 259 SIG: 3
09-20 20:33:27.489: INFO/dalvikvm(259): threadid=3: reacting to signal 3
09-20 20:33:27.498: INFO/dalvikvm(259): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:27.508: INFO/Process(59): Sending signal. PID: 116 SIG: 3
09-20 20:33:27.508: INFO/dalvikvm(116): threadid=3: reacting to signal 3
09-20 20:33:27.519: INFO/dalvikvm(116): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:27.553: INFO/Process(59): Sending signal. PID: 211 SIG: 3
09-20 20:33:27.553: INFO/dalvikvm(211): threadid=3: reacting to signal 3
09-20 20:33:27.588: INFO/dalvikvm(59): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:27.588: INFO/Process(59): Sending signal. PID: 128 SIG: 3
09-20 20:33:27.588: INFO/dalvikvm(128): threadid=3: reacting to signal 3
09-20 20:33:27.800: INFO/Process(59): Sending signal. PID: 294 SIG: 3
09-20 20:33:27.932: INFO/dalvikvm(294): threadid=3: reacting to signal 3
09-20 20:33:28.010: INFO/Process(59): Sending signal. PID: 122 SIG: 3
09-20 20:33:28.010: INFO/dalvikvm(122): threadid=3: reacting to signal 3
09-20 20:33:28.219: INFO/Process(59): Sending signal. PID: 174 SIG: 3
09-20 20:33:28.272: INFO/dalvikvm(174): threadid=3: reacting to signal 3
09-20 20:33:28.428: INFO/Process(59): Sending signal. PID: 121 SIG: 3
09-20 20:33:28.428: INFO/dalvikvm(121): threadid=3: reacting to signal 3
09-20 20:33:28.519: INFO/dalvikvm(121): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:28.534: INFO/Process(59): Sending signal. PID: 242 SIG: 3
09-20 20:33:28.728: INFO/dalvikvm(242): threadid=3: reacting to signal 3
09-20 20:33:28.759: INFO/Process(59): Sending signal. PID: 232 SIG: 3
09-20 20:33:28.879: INFO/dalvikvm(232): threadid=3: reacting to signal 3
09-20 20:33:28.951: WARN/ActivityManager(59): Launch timeout has expired, giving up wake lock!
09-20 20:33:28.972: INFO/Process(59): Sending signal. PID: 249 SIG: 3
09-20 20:33:29.128: INFO/dalvikvm(249): threadid=3: reacting to signal 3
09-20 20:33:29.175: INFO/Process(59): Sending signal. PID: 190 SIG: 3
09-20 20:33:29.261: INFO/dalvikvm(190): threadid=3: reacting to signal 3
09-20 20:33:29.388: INFO/Process(59): Sending signal. PID: 222 SIG: 3
09-20 20:33:29.414: INFO/dalvikvm(222): threadid=3: reacting to signal 3
09-20 20:33:29.569: WARN/ActivityManager(59): Activity idle timeout for HistoryRecord{44f7fdd0 app.android/.TestActivity}
09-20 20:33:29.590: INFO/Process(59): Sending signal. PID: 199 SIG: 3
09-20 20:33:29.789: INFO/dalvikvm(199): threadid=3: reacting to signal 3
09-20 20:33:29.789: INFO/Process(59): Sending signal. PID: 161 SIG: 3
09-20 20:33:29.865: INFO/dalvikvm(161): threadid=3: reacting to signal 3
09-20 20:33:30.058: ERROR/ActivityManager(59): ANR in app.android (app.android/.TestActivity)
09-20 20:33:30.058: ERROR/ActivityManager(59): Reason: keyDispatchingTimedOut
09-20 20:33:30.058: ERROR/ActivityManager(59): Load: 2.11 / 1.1 / 0.59
09-20 20:33:30.058: ERROR/ActivityManager(59): CPU usage from 256798ms to 54ms ago:
09-20 20:33:30.058: ERROR/ActivityManager(59):   system_server: 11% = 8% user + 2% kernel / faults: 6688 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   adbd: 2% = 0% user + 2% kernel / faults: 73 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   ndroid.settings: 1% = 0% user + 0% kernel / faults: 732 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   id.defcontainer: 0% = 0% user + 0% kernel / faults: 69 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   ackageinstaller: 0% = 0% user + 0% kernel / faults: 638 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   d.process.acore: 0% = 0% user + 0% kernel / faults: 2315 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   zygote: 0% = 0% user + 0% kernel / faults: 20 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   ndroid.launcher: 0% = 0% user + 0% kernel / faults: 67 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   logcat: 0% = 0% user + 0% kernel
09-20 20:33:30.058: ERROR/ActivityManager(59):   qemud: 0% = 0% user + 0% kernel
09-20 20:33:30.058: ERROR/ActivityManager(59):   com.svox.pico: 0% = 0% user + 0% kernel / faults: 29 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   zygote: 0% = 0% user + 0% kernel / faults: 8 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   installd: 0% = 0% user + 0% kernel / faults: 12 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   rild: 0% = 0% user + 0% kernel
09-20 20:33:30.058: ERROR/ActivityManager(59):   zygote: 0% = 0% user + 0% kernel / faults: 33 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   m.android.email: 0% = 0% user + 0% kernel / faults: 17 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   events/0: 0% = 0% user + 0% kernel
09-20 20:33:30.058: ERROR/ActivityManager(59):   d.process.media: 0% = 0% user + 0% kernel / faults: 10 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   .quicksearchbox: 0% = 0% user + 0% kernel / faults: 13 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   com.android.mms: 0% = 0% user + 0% kernel / faults: 7 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   android.protips: 0% = 0% user + 0% kernel / faults: 8 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):   m.android.music: 0% = 0% user + 0% kernel / faults: 13 minor
09-20 20:33:30.058: ERROR/ActivityManager(59):  +app.android: 0% = 0% user + 0% kernel
09-20 20:33:30.058: ERROR/ActivityManager(59):  +app.android: 0% = 0% user + 0% kernel
09-20 20:33:30.058: ERROR/ActivityManager(59): TOTAL: 26% = 19% user + 6% kernel + 0% irq + 0% softirq
09-20 20:33:30.092: WARN/WindowManager(59): No window to dispatch pointer action 1
09-20 20:33:30.579: DEBUG/dalvikvm(59): GC_FOR_MALLOC freed 4728 objects / 436488 bytes in 426ms
09-20 20:33:30.779: INFO/dalvikvm(294): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:31.018: DEBUG/dalvikvm(59): GC_FOR_MALLOC freed 420 objects / 117384 bytes in 403ms
09-20 20:33:31.158: WARN/WindowManager(59): No window to dispatch pointer action 1
09-20 20:33:31.158: WARN/WindowManager(59): No window to dispatch pointer action 0
09-20 20:33:31.158: WARN/WindowManager(59): No window to dispatch pointer action 1
09-20 20:33:32.258: INFO/dalvikvm(249): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:32.643: INFO/dalvikvm(242): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:32.898: DEBUG/dalvikvm(1091): GC_EXTERNAL_ALLOC freed 196 objects / 9744 bytes in 80ms
09-20 20:33:32.908: INFO/dalvikvm(222): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:33.078: DEBUG/dalvikvm(1091): GC_FOR_MALLOC freed 39 objects / 2448 bytes in 153ms
09-20 20:33:33.088: INFO/dalvikvm-heap(1091): Grow heap (frag case) to 4.132MB for 550416-byte allocation
09-20 20:33:33.238: DEBUG/dalvikvm(1091): GC_FOR_MALLOC freed 0 objects / 0 bytes in 151ms
09-20 20:33:33.428: DEBUG/dalvikvm(1091): GC_FOR_MALLOC freed 10 objects / 360 bytes in 75ms
09-20 20:33:33.609: INFO/dalvikvm(161): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:33.829: INFO/dalvikvm(232): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:34.008: INFO/dalvikvm(190): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:34.499: INFO/dalvikvm(128): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:34.532: INFO/dalvikvm(199): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:34.928: INFO/dalvikvm(122): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:34.967: INFO/dalvikvm(174): Wrote stack traces to '/data/anr/traces.txt'
09-20 20:33:35.240: INFO/dalvikvm(211): Wrote stack traces to '/data/anr/traces.txt'

Esiste un modo per disattivare gli eventi touch screen prima della visualizzazione e riattivarli subito dopo?
Ho provato setClickable(false) all'inizio di onDraw e setClickable(true) dopo canvas.drawBitmap ma non funziona.
Qualche suggerimento?
Grazie in anticipo
« Ultima modifica: 20 Settembre 2011, 21:46:03 CEST da Andrew »

Offline Andrew

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 11.04, Windows Xp
Re:Problemi prima della visualizzazione di una bitmap
« Risposta #1 il: 21 Settembre 2011, 00:01:44 CEST »
0
Ho visto che mi lancia un ANR (Application Not Responding). Questo è dovuto al fatto che tengo impegnato il thread UI in una lunga operazione di elaborazione mentre nel frattempo genero eventi touch.
La soluzione è quella di creare un thread separato per l'elaborazione. Qualcuno sa come posso creare un thread separato che richiama un metodo che compie operazioni sull'immagine? Considerando che il thread UI è quello che esegue onDraw, da onDraw come faccio a richiamare il worker thread? Potreste fornirmi un esempio?
Grazie.

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problemi prima della visualizzazione di una bitmap
« Risposta #2 il: 21 Settembre 2011, 03:15:46 CEST »
0
Ciao! Secondo me dovresti seguire questa logica:
- parte il primo onDraw e, nell'onDraw verifichi se è stata elaborata l'immagine (una variabile boolean oppure, se crei una nuova bitmap con l'immagine modificata, controlli che questa non sia nulla.
- essendo il primo onDraw, l'immagine non sarà stata elaborata, quindi l'ipotetica viariabile boolean sarà false o l'ipotetica bitmap sara null. A questo punto fai partire un'asyncTask che elabori l'immagine.
- nell'onPostExecute setti l'ipotetica boolean come true e richiami il metodo invalidate(), che richiamerà l'onDraw
- questa volta l'onDraw può tranquillamente disegnare la bitmap.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problemi prima della visualizzazione di una bitmap
« Risposta #3 il: 21 Settembre 2011, 07:52:55 CEST »
0
Ho visto che mi lancia un ANR (Application Not Responding). Questo è dovuto al fatto che tengo impegnato il thread UI in una lunga operazione di elaborazione mentre nel frattempo genero eventi touch.
La soluzione è quella di creare un thread separato per l'elaborazione. Qualcuno sa come posso creare un thread separato che richiama un metodo che compie operazioni sull'immagine? Considerando che il thread UI è quello che esegue onDraw, da onDraw come faccio a richiamare il worker thread? Potreste fornirmi un esempio?

Non c'è un tutorial o un esempio per la tua applicazione specifica, ma nel forum ci sono tutorial sia per thread che per asynctask. Insomma, oltre a fare copia e incolla c'è da capirlo e modificarlo un po'.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Andrew

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 11.04, Windows Xp
Re:Problemi prima della visualizzazione di una bitmap
« Risposta #4 il: 21 Settembre 2011, 22:31:25 CEST »
0
Grazie a Verandi e bradipao. Ho provato con un asyncTask e funziona. Tuttavia quando lo sfondo è ancora nero perchè l'immagine elaborata deve essere ancora visualizzata, mi sono accorto che se muovo il dito sullo schermo ritardo la visualizzazione dell'immagine. C'è un modo per rimediare a questo problema, magari disattivando gli eventi di touch della finestra per poi riattivarli a visualizzazione completata?
Altra cosa: secondo voi se usassi un service al posto di un asynTask migliorerei la situazione?