L LuigiTasca Member Licensed User Longtime User Dec 12, 2018 #1 Ciao a tutti, Ho sviluppato nella mia applicazione la comunicazione con un misuratore fiscale, apro un socket su questo e scrivo i vari comandi nel flusso. Ad ogni comando inviato devo però intercettare la risposta da questo per verificarne l'esito, cosa che ho gestito con i wait for. Esempio di un comando Code: MioStream.Write("<miocomando>") Wait For (MioStream) MioStream_newdata(Buffer() As Byte) Dim Text As String = BytesToString(Buffer, 0, Buffer.Length, "UTF8") 'Text è l'esito ritornato dal misuratore Fino a qui tutto OK. Il problema è che una volta ogni n scontrini, in maniera del tutto casuale, non si scatena il wait for. L'app arriva ad eseguire il "write" ma quando deve arrivare al wait for l'esecuzione sparisce non si sa dove. In poche parole esce dalla funzione. Il comando arriva al misuratore e viene eseguito correttamente. Code: MioStream.Write("<miocomando>") Wait For (MioStream) MioStream_newdata(Buffer() As Byte) '<--- Non passa mai di qui Dim Text As String = BytesToString(Buffer, 0, Buffer.Length, "UTF8") Pensando fosse un problema del misuratore, e che fosse questo a non scrivermi niente (non generando l'evento MioStream_newdata) sono riuscito a fare una gestione con un timer nel quale scateno "MioStream_newdata" manualmente con un callsub. Ho provato questa mia "soluzione" e funzionerebbe (nei casi in cui prevedo io "manualmente" a far si che il misuratore non mi restituisca niente). Il problema è nei casi "reali", in cui il programma esce dalla funzione al wait for che si scatena mai. Sapete dirmi da cosa può essere dovuto o come "aggirare" il problema? Grazie
Ciao a tutti, Ho sviluppato nella mia applicazione la comunicazione con un misuratore fiscale, apro un socket su questo e scrivo i vari comandi nel flusso. Ad ogni comando inviato devo però intercettare la risposta da questo per verificarne l'esito, cosa che ho gestito con i wait for. Esempio di un comando Code: MioStream.Write("<miocomando>") Wait For (MioStream) MioStream_newdata(Buffer() As Byte) Dim Text As String = BytesToString(Buffer, 0, Buffer.Length, "UTF8") 'Text è l'esito ritornato dal misuratore Fino a qui tutto OK. Il problema è che una volta ogni n scontrini, in maniera del tutto casuale, non si scatena il wait for. L'app arriva ad eseguire il "write" ma quando deve arrivare al wait for l'esecuzione sparisce non si sa dove. In poche parole esce dalla funzione. Il comando arriva al misuratore e viene eseguito correttamente. Code: MioStream.Write("<miocomando>") Wait For (MioStream) MioStream_newdata(Buffer() As Byte) '<--- Non passa mai di qui Dim Text As String = BytesToString(Buffer, 0, Buffer.Length, "UTF8") Pensando fosse un problema del misuratore, e che fosse questo a non scrivermi niente (non generando l'evento MioStream_newdata) sono riuscito a fare una gestione con un timer nel quale scateno "MioStream_newdata" manualmente con un callsub. Ho provato questa mia "soluzione" e funzionerebbe (nei casi in cui prevedo io "manualmente" a far si che il misuratore non mi restituisca niente). Il problema è nei casi "reali", in cui il programma esce dalla funzione al wait for che si scatena mai. Sapete dirmi da cosa può essere dovuto o come "aggirare" il problema? Grazie
L LuigiTasca Member Licensed User Longtime User Dec 13, 2018 #3 MarcoRome said: Senza il codice è difficile da dirsi Click to expand... Immagino, purtroppo non posso proprio postare il codice. Comunque ho scoperto perché esce. L'applicazione va in errore al Wait For e da questo errore: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.WeakReference.get()' on a null object reference Per caso qualcuno sa da cosa è dovuto? È un errore di B4A?
MarcoRome said: Senza il codice è difficile da dirsi Click to expand... Immagino, purtroppo non posso proprio postare il codice. Comunque ho scoperto perché esce. L'applicazione va in errore al Wait For e da questo errore: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.WeakReference.get()' on a null object reference Per caso qualcuno sa da cosa è dovuto? È un errore di B4A?
P Picena Informatica Active Member Licensed User Longtime User Dec 13, 2018 #4 prova con: Wait For (MioStream) newdata(Buffer() As Byte) Non provato
L LuigiTasca Member Licensed User Longtime User Dec 13, 2018 #5 picenainformatica said: prova con: Wait For (MioStream) newdata(Buffer() As Byte) Non provato Click to expand... Ora provo Comunque ho postato la mio problematica in "Android Questions" https://www.b4x.com/android/forum/t...ence-nullpointerexception.100388/#post-630993
picenainformatica said: prova con: Wait For (MioStream) newdata(Buffer() As Byte) Non provato Click to expand... Ora provo Comunque ho postato la mio problematica in "Android Questions" https://www.b4x.com/android/forum/t...ence-nullpointerexception.100388/#post-630993
LucaMs Expert Licensed User Longtime User Dec 13, 2018 #6 Pubblica qualche riga in più del messaggio d'errore.
L LuigiTasca Member Licensed User Longtime User Dec 13, 2018 #7 L'errore riesco a simularlo solo in release. È "gestito" dentro ad un try catch ed il log(LastException.Message) mi restituisce solo questa riga. Scusate la domanda, ma come posso fare per ottenere il messaggio d'errore completo?
L'errore riesco a simularlo solo in release. È "gestito" dentro ad un try catch ed il log(LastException.Message) mi restituisce solo questa riga. Scusate la domanda, ma come posso fare per ottenere il messaggio d'errore completo?
L LuigiTasca Member Licensed User Longtime User Dec 14, 2018 #9 Ecco l'errore completo work$ResumableSub_PrintReceiptresume (java line: 39630) java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.WeakReference.get()' on a null object reference at anywheresoftware.b4a.keywords.Common.WaitFor(Common.java:1713) at com.MyCompany.myapp.work$ResumableSub_PrintReceipt.resume(work.java:39630) at anywheresoftware.b4a.BA.checkAndRunWaitForEvent(BA.java:245) at anywheresoftware.b4a.BA.raiseEvent2(BA.java:185) at anywheresoftware.b4a.BA$2.run(BA.java:365) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5258) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.WeakReference.get()' on a null object reference
Ecco l'errore completo work$ResumableSub_PrintReceiptresume (java line: 39630) java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.WeakReference.get()' on a null object reference at anywheresoftware.b4a.keywords.Common.WaitFor(Common.java:1713) at com.MyCompany.myapp.work$ResumableSub_PrintReceipt.resume(work.java:39630) at anywheresoftware.b4a.BA.checkAndRunWaitForEvent(BA.java:245) at anywheresoftware.b4a.BA.raiseEvent2(BA.java:185) at anywheresoftware.b4a.BA$2.run(BA.java:365) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5258) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.WeakReference.get()' on a null object reference
LucaMs Expert Licensed User Longtime User Dec 14, 2018 #10 Guardando il tuo codice nel "post inglese", ti suggerirei di scrivere dei log prima di ogni wait for (tipo: logcolor("ho lanciato questo comando xxxx", Colors.Blue). Sempre una riga prima del wait for, avvia un timer (uno diverso per ogni wait for); scaduto il tempo, quindi nell'evento _tick, chiama tu stesso, usando CallSubDelayed, la "routine" che fa sì che l'attesa termini (spero di essermi spiegato, anche se non credo )
Guardando il tuo codice nel "post inglese", ti suggerirei di scrivere dei log prima di ogni wait for (tipo: logcolor("ho lanciato questo comando xxxx", Colors.Blue). Sempre una riga prima del wait for, avvia un timer (uno diverso per ogni wait for); scaduto il tempo, quindi nell'evento _tick, chiama tu stesso, usando CallSubDelayed, la "routine" che fa sì che l'attesa termini (spero di essermi spiegato, anche se non credo )
L LuigiTasca Member Licensed User Longtime User Dec 14, 2018 #11 Ci ho già provato Funzionerebbe pure (nei casi in cui lo testo io, simulando la mancata risposta dal misuratore). Il problema è che l'errore è proprio nel wait for, quindi che sia scatenato l'evento newdata del misuratore o dal mio timer di "timeout" non supera mai il WaitFor. L'evento c'è. Domanda a chi ne sa più di me... Come funziona "sotto" un Wait For a livello tecnico? Perché mi genera un WeakReference null pointer exception?
Ci ho già provato Funzionerebbe pure (nei casi in cui lo testo io, simulando la mancata risposta dal misuratore). Il problema è che l'errore è proprio nel wait for, quindi che sia scatenato l'evento newdata del misuratore o dal mio timer di "timeout" non supera mai il WaitFor. L'evento c'è. Domanda a chi ne sa più di me... Come funziona "sotto" un Wait For a livello tecnico? Perché mi genera un WeakReference null pointer exception?
sirjo66 Well-Known Member Licensed User Longtime User Dec 14, 2018 #12 secondo me a questo punto lascia stare il Wait For e fai tu la gestione come si faceva una volta "event driver" su alcune mie app che usano le chiamate HTTP ho preferito gestire il tutto "alla vecchia maniera" anzichè usare il Wait For Fai una variabile globale (ad esempio la chiami Fase) dove ci scrivi dentro quello che stai facendo e quando chiama NewData con un Select dirotti il codice al punto giusto
secondo me a questo punto lascia stare il Wait For e fai tu la gestione come si faceva una volta "event driver" su alcune mie app che usano le chiamate HTTP ho preferito gestire il tutto "alla vecchia maniera" anzichè usare il Wait For Fai una variabile globale (ad esempio la chiami Fase) dove ci scrivi dentro quello che stai facendo e quando chiama NewData con un Select dirotti il codice al punto giusto