Italian [B4J - B4XPages] Errore solo al primo avvio dell'app in fase di debug

Elric

Well-Known Member
Licensed User
Ciao,

ho un'applicazione in B4J (B4XPages).

In fase di debug, al primo avvio mi dà l'errore citato appresso, senza avviare l'app, mentre dal secondo avvio in avanti fila tutto liscio.

B4X:
Waiting for debugger to connect...
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.NullPointerException
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:383)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    ... 5 more
java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplicationWithArgs$155(LauncherImpl.java:352)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.RuntimeException: java.net.SocketException: Socket closed
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:138)
    at anywheresoftware.b4a.shell.ShellBA.raiseEvent2(ShellBA.java:98)
    at b4j.QuizPep.main.<clinit>(main.java:17)
    ... 11 more
Caused by: java.net.SocketException: Socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:171)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
    at java.io.DataInputStream.readByte(DataInputStream.java:265)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:229)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:167)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:109)
    ... 13 more

Non capisco l'errore.
 

Star-Dust

Expert
Licensed User
Longtime User
Devi fare direttamente il secondo avvio, non fare il primo ?

Comunque lettore dice che c'è il socket chiuso. Ti connetti a qualcosa? Stai usando un socket senza che sia ancora inizializzato o connesso?
 
Last edited:

Elric

Well-Known Member
Licensed User
E' probabile che ci sia qualcosa di sbagliato nella Process_Globals
Non l'ho toccato.
B4X:
Sub Process_Globals
    Private fx As JFX
    Private MainForm As Form
End Sub

Drvinfare direttamente il secondo avvio, non fare il primo ?
Ci stavo pensando, in effetti.
Comunque lettore dice che c'è il socket chiuso. Ti connetti a qualcosa? Stai usando un socket senza che sia ancora inizializzato o connesso?
Mi collego a un database su Altervista (usa un socket? Non lo so, non ho ancora capito bene cosa sia, quindi non so rispondere).

Ma un problema di connessione non dovrebbe presentarsi ad ogni avvio?
 

Star-Dust

Expert
Licensed User
Longtime User
Mi collego a un database su Altervista (usa un socket? Non lo so, non ho ancora capito bene cosa sia, quindi non so rispondere).
Si, ogni connessione a internet usa un socket

Ma un problema di connessione non dovrebbe presentarsi ad ogni avvio?
Non necessariamente. A volte richiedi la risorsa quando non è ancora disponibile (l'accesso a un socket è una di quelle risorse che non sempre è immediata)

Fammi vedere un pò di codice, cosi capiamo qualcosa in più
 

Star-Dust

Expert
Licensed User
Longtime User
 

Elric

Well-Known Member
Licensed User
Proviamo:

La B4XMainPage setta come nativa la pagina di login
B4X:
Public Sub Initialize
'    B4XPages.GetManager.LogEvents = True
    pagLogin.Initialize
    B4XPages.AddPage("Login", pagLogin)
    B4XPages.GetNativeParent(pagLogin).Resizable = False
   
    pagSettings.Initialize
    B4XPages.AddPage("Settings", pagSettings)
   
    pagQuiz.Initialize
    B4XPages.AddPage("Quiz", pagQuiz)

    B4XPages.ShowPage("Login")
End Sub

La pagina di login non si collega a niente, ad oggi; deve ancora essere implementata e, ad oggi, non fa nulla se non memorizzare in una variabile l'username.
B4X:
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    'load the layout to Root
    Root.LoadLayout("layLogin")
   
End Sub

'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
Private Sub btnLogin_Click
    strUserName = txtUserLogin.Text
    B4XPages.ShowPageAndRemovePreviousPages("Settings")
End Sub

Private Sub B4XPage_CloseRequest As ResumableSub
    Dim sf As Object = xui.Msgbox2Async("Do you want to quit ?", "Quit", "Yes", "Cancel", "No", Null)
    Wait For (sf) Msgbox_Result (Result As Int)
    If Result = xui.DialogResponse_Positive Then
        Return True
    End If
    Return False
End Sub

C'è la pagina di Settings (la pagina che si apre dopo il login) dove le richieste di download avvengono solo premendo un pulsante. A parte un'iniziale download, il resto viene gestito nel database locale SQLite. Ad oggi ha oltre 1300 righe e, come vi dicevo, c'è di ogni.
B4X:
Private Sub btnDownLoadPHPDB_Click
   
    strDBDownloadedFromPHP = cmbQuizVersion.SelectedItem
   
    If Not(ynDBDownloaded) Then
        Wait For (DownloadFromPHPAndInsertInLocalDB(SQL1, strSQLTableName)) Complete (Result As Boolean)
    End If
   
    SetlblDownloaded
End Sub

Private Sub btnDownLoadLocalDB_Click
   
    If Not(ynDBDownloaded) Then
        Wait For (DownloadFromPHPAndInsertInLocalDB(SQL1, strSQLTableName)) Complete (Result As Boolean)
    End If
   
    Wait For (sqlCheckIfTableExistInSQL(SQL1, strSQLTableName)) Complete (ResultBool As Boolean)
    If ResultBool Then
        ynDBSaveInLocal = True
    End If
    SetlblDownloadedInLocal
End Sub

Private Sub DownloadFromPHPAndInsertInLocalDB(mySQLite As SQL, mystrSQLTableName As String) As ResumableSub
    ClearLists
   
    Wait For(LoadPHP) Complete (ResultList As List)
    If ResultList.Size > 0 Then
        Wait For(PopulateListsFromPHP(ResultList)) Complete (Result As Int)
   
        If Not(DBUtils.TableExists(mySQLite, mystrSQLTableName)) Then
            sqlCreateQuizSQLTable(mySQLite, mystrSQLTableName)
        End If
        sqlInsertListsInLocalDB(mySQLite, mystrSQLTableName)
       
        ynDBDownloaded = True
       
        SetlblDownloadedTrue
        Sleep(5)
        CSelections.SelectAndMakeVisible(0)
    End If
   
    Return True
   
End Sub

Private Sub LoadPHP As ResumableSub
    AnotherProgressBar1.Visible = True
   
    Dim myQuery As String
    myQuery = strSQLSelectAll
    Dim myJob As HttpJob
    myJob.Initialize("", Me)
   
    Dim MD5 As String
    If strPasswordOriginPHPMySQL <> "" Then
        MD5 = MD5calc(strPasswordOriginPHPMySQL & myQuery) ' la password deve essere la stessa del file PHP
    Else
        MD5 = ""
    End If
    myJob.Download(strURLOriginPHPMySQL & "/execute.php?chk=" & MD5 & "&table=" & strSQLTableName & "&action=" & myQuery)
   
    Try
        Wait For (myJob) JobDone(myJob As HttpJob)
       
        If myJob.Success Then
            Dim res As String
            res = myJob.GetString
            Log("Response from server: " & res.SubString2(0, 999))
           
            If res <> "[]" Then
                Dim parser As JSONParser
                parser.Initialize(res)

                Dim myList As List
                myList.Initialize
                myList = parser.NextArray
               
            End If
        Else
            Log("ERROR: " & myJob.ErrorMessage)
        End If
        myJob.Release
    Catch
        Log(LastException)
    End Try
   
    AnotherProgressBar1.Visible = False
    Return myList
   
End Sub
 

Star-Dust

Expert
Licensed User
Longtime User
Quale riga genera l'errore?
 

Star-Dust

Expert
Licensed User
Longtime User
Ame genera un errore diverso, come se il dns non trova l'indirizzo
 

Star-Dust

Expert
Licensed User
Longtime User
Ok, hai messo un indirizzo farlocco ecco perchè.
Comunque il codice sembra corretto.

Mi è venuto un sospetto. In release mode ti da errore o solo in debug?
Ti da errore ancor prima di mettere le credenziali proprio all'avvio?
Oppure ti da errore dopo che hai messo le credenziali e cliccato su connect?
 

Elric

Well-Known Member
Licensed User
Mi è venuto un sospetto. In release mode ti da errore o solo in debug?
Ho provato in modalità Released (obfuscated) e non mi ha dato questo errore.

Me lo ha sempre dato in modalità Debug e me lo dà sempre al primo avvio dopo aver pulito il progetto. Dal secondo avvio in avanti non lo dà mai.

Ti da errore ancor prima di mettere le credenziali proprio all'avvio?
Oppure ti da errore dopo che hai messo le credenziali e cliccato su connect?
Il programma non si avvia proprio. Clicco su "Run(F5)" e ottengo l'errore senza che l'app si sia avviata. Dopodiché avvio nuovamente "Run(F5)" e si avvia tranquillamente e funziona.
 

LucaMs

Expert
Licensed User
Longtime User

Elric

Well-Known Member
Licensed User
Provato a reinstallare senza disinstallare.

Pare funzioni! Vediamo come si comporta...
 
Top