Android Question Save error: (NetworkOnMainThreadException) android.os.NetworkOnMainThreadException

amarnath

Member
Licensed User
Longtime User
B4X:
Private Sub DosaveRecord
 
    B4XLoadingIndicator1.Show
    Dim LedgerName As String = Txt_SLedger.Text.Trim
    If LedgerName.Length < 3 Then
        xui.MsgboxAsync("Please enter a valid Supplier Name (min 3 characters).", "Validation")
        Return
    End If

    ' Check for duplicate
    Wait For (LedgerExists(LedgerName)) Complete (exists As Boolean)
    If exists Then
        xui.MsgboxAsync("A ledger with this name already exists.", "Duplicate Entry")
        Return
    End If

    If TxtOpBalanceAmt.Text = "" Then TxtOpBalanceAmt.Text = "0"

    Dim Dr As String = "0", Cr As String = "0", OpDr As String = "0", OpCr As String = "0"
    If Txt_DrCr.SelectedItem = "Dr" Then
        Dr = TxtOpBalanceAmt.Text
        OpDr = TxtOpBalanceAmt.Text
    Else
        Cr = TxtOpBalanceAmt.Text
        OpCr = TxtOpBalanceAmt.Text
    End If

    Dim MobNo As String = Txt_MobileNo.Text.Trim
    If MobNo = "" Or MobNo = "0" Then MobNo = "0"

    ' Sanitize inputs (basic SQL injection protection)
    Dim SafeLedgerName As String = LedgerName.Replace("'", "''")
    Dim SafeEmail As String = Txt_Email.Text.Replace("'", "''")
    Dim SafeBank As String = Txt_BranchName.Text.Replace("'", "''")
    Dim SafeAccNo As String = Txt_AccountNo.Text.Replace("'", "''")
    Dim SafeIFSC As String = Txt_IFSCcode.Text.Replace("'", "''")

'    Dim mysqlstr As String = $"INSERT INTO ledgers (LedgerName, LedgerCode, AccountGroup, accounttype, DocBranch, Route, village, MilkType, CustType, MemCode, ChairName, Cmob, emailid, BankName, BacNo, IFCcode, createdby, Isactive, Dr, Cr, OpDr, OpCr, IsBillWise, CreditPeriod, Currency, currentbalance, LedgerNameTemp, BankAccNo, IsSendSMS, DCID) VALUES ('${SafeLedgerName}', '${Txt_AccID.Text}', 'Suppliers Account', 'Suppliers Account', 'Local', '${Txt_Route.SelectedItem}', '${Txt_Village.SelectedItem}', '${Txt_Milktype.SelectedItem}', '${Txt_Custtype.SelectedItem}', '${Txt_MemCode.Text}', '${SafeLedgerName}', '${MobNo}', '${SafeEmail}', '${SafeBank}', '${SafeAccNo}', '${SafeIFSC}', '${Starter.CurrentUserName}', '1', '${Dr}', '${Cr}', '${OpDr}', '${OpCr}', '1', '30', 'INR', '0', '${SafeLedgerName}', '${SafeAccNo}', '0', '${DCID}')"$
'    Log(mysqlstr)
'    Try
'        Wait For (Starter.Connect) Complete (success As Boolean)
'        If success Then
'            Starter.mysql.BeginTransaction
'            Starter.mysql.ExecNonQuery(mysqlstr)
'            Starter.mysql.TransactionSuccessful
'            Starter.CloseConnection
'            Log("Ledger saved")
'        End If
'    Catch
'        Log("Save error: " & LastException)
'        xui.MsgboxAsync("Failed to save record.", "Error")
'        Return
'    End Try
'
'    ' Opening balance
'    If TxtOpBalanceAmt.Text > 0 Then
'        Dim transStr As String = $"INSERT INTO ledgerbook (LedgerName, TransCode, InvoiceNo, InvoiceType, InvoiceName, sno, Dr, Cr, LedgerGroup, AcLedger, IsAdvance, IsDeleted, UserName, Narration, ConRate, DCID) VALUES ('${SafeLedgerName}', '0', '0', 'Opening Balance', 'Opening Balance', '1', '${Dr}', '${Cr}', '${Txt_Custtype.SelectedItem}', 'Opening', '0', '0', '${Starter.CurrentUserName}', 'Opening Balances', '1', '${DCID}')"$
'        Log(transStr)
'        Try
'            Wait For (Starter.Connect) Complete (success As Boolean)
'            If success Then
'                Starter.mysql.BeginTransaction
'                Starter.mysql.ExecNonQuery(transStr)
'                Starter.mysql.TransactionSuccessful
'                Starter.CloseConnection
'            End If
'        Catch
'            Log("Opening balance error: " & LastException)
'        End Try
'    End If

    ' Start single DB session
    Wait For (Starter.Connect) Complete (connected As Boolean)
    If connected = False Then
        xui.MsgboxAsync("Database connection failed.", "Error")
        B4XLoadingIndicator1.Hide
        Return
    End If

Try
 
    Starter.mysql.BeginTransaction
        Dim mysqlstr As String = $"INSERT INTO ledgers (LedgerName, LedgerCode, AccountGroup, accounttype, DocBranch, Route, village, MilkType, CustType, MemCode, ChairName, Cmob, emailid, BankName, BacNo, IFCcode, createdby, Isactive, Dr, Cr, OpDr, OpCr, IsBillWise, CreditPeriod, Currency, currentbalance, LedgerNameTemp, BankAccNo, IsSendSMS, DCID) VALUES ('${SafeLedgerName}', '${Txt_AccID.Text}', 'Suppliers Account', 'Suppliers Account', 'Local', '${Txt_Route.SelectedItem}', '${Txt_Village.SelectedItem}', '${Txt_Milktype.SelectedItem}', '${Txt_Custtype.SelectedItem}', '${Txt_MemCode.Text}', '${SafeLedgerName}', '${MobNo}', '${SafeEmail}', '${SafeBank}', '${SafeAccNo}', '${SafeIFSC}', '${Starter.CurrentUserName}', '1', '${Dr}', '${Cr}', '${OpDr}', '${OpCr}', '1', '30', 'INR', '0', '${SafeLedgerName}', '${SafeAccNo}', '0', '${DCID}')"$
        Log(mysqlstr)
        Starter.mysql.ExecNonQuery(mysqlstr)
   
        ' --- 2. Insert opening balance (if any) ---
        If TxtOpBalanceAmt.Text > 0 Then
        Dim transStr As String = $"INSERT INTO ledgerbook (LedgerName, TransCode, InvoiceNo, InvoiceType, InvoiceName, sno, Dr, Cr, LedgerGroup, AcLedger, IsAdvance, IsDeleted, UserName, Narration, ConRate, DCID) VALUES ('${SafeLedgerName}', '0', '0', 'Opening Balance', 'Opening Balance', '1', '${Dr}', '${Cr}', '${Txt_Custtype.SelectedItem}', 'Opening', '0', '0', '${Starter.CurrentUserName}', 'Opening Balances', '1', '${DCID}')"$
        Log(transStr)
        Try
'            Wait For (Starter.Connect) Complete (success As Boolean)
'            If success Then
'                Starter.mysql.BeginTransaction
                Starter.mysql.ExecNonQuery(transStr)
'                Starter.mysql.TransactionSuccessful
'                Starter.CloseConnection
'            End If

        Catch
            Log("Opening balance error: " & LastException)
        End Try
        End If
        Starter.mysql.TransactionSuccessful
        Log("Ledger and opening balance saved successfully")
    Catch
        Log("Save error: " & LastException)
        xui.MsgboxAsync("Failed to save record: " & LastException.Message, "Error")
        ' Transaction auto-rolls back on exception
        Starter.CloseConnection
        B4XLoadingIndicator1.Hide
        Return
End Try
    Starter.CloseConnection
 
 
    ' Update counters
    If Txt_Custtype.SelectedItem = "Milk Member" Then
        Wait For (UpdateMilkMemID) complete (NewMemId As String)
        'UpdateMilkMemID
        Log("New mem Code: " & NewMemId)
    Else
        Txt_MemCode.Text = "0"
    End If

    Wait For (UpdateAccountCode) Complete (NewAccCode As String)
    If NewAccCode <> "" Then
        Log("New Account Code: " & NewAccCode)
    Else
        Log("Failed to update or retrieve Account Code")
    End If
 
    ' Refresh next ID
    Wait For (FetchAccountCode) Complete (newAccID As String)
    Txt_AccID.Text = "Acc" & newAccID

    ' Reset form
    Txt_SLedger.Text = ""
    TxtOpBalanceAmt.Text = "0.00"
    Txt_MobileNo.Text = ""
    Txt_Email.Text = ""
    Txt_AccountNo.Text = ""
    Txt_IFSCcode.Text = "0"
    Txt_Custtype.SelectedIndex = 1
    BtnNew.Enabled = True
    btn_Save.Enabled = False
'    btn_Save.Color = Colors.Gray
    PanMemCode.Visible = False
    dyt.SuccessMessageToast = "Save Successful!"
    Txt_SLedger.TextField.RequestFocus
'    dyt.ShowSuccess
B4XLoadingIndicator1.Hide
End Sub

when run in debug mode then query is secussfully insert in database. but when release mode run the code then error bellow

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Public mysql As JdbcSQL         
    Public driver As String = "com.mysql.jdbc.Driver"
    'Public jdbcUrl As String = "jdbc:mysql://207.174.214.245:3000/amarn_d?characterEncoding=utf8" 'windows host
    'Public jdbcUrl As String = "jdbc:mysql://208.91.198.26:3000/amarn_d?characterEncoding=utf8"
    Public jdbcUrl As String = "jdbc:mysql://207.174.214.245:3000/amarn_d?useSSL=False&characterEncoding=utf8" 'lunix host
    '208.91.198.26
    Public Username As String = "amarn_amar"
    Public Password As String = "Amarnath@#4568"
    Public CurrentUserName As String="Admin"
    Public HtmlCSS As String
    Public SQL1 As SQL
 
'     Public TastyTos As TastyToast
     Public DyTost As DynamicToast
  
    Public csu As CallSubUtils
  
'

    Public fFileProvider As FileProvider
 

End Sub
Save error: (NetworkOnMainThreadException) android.os.NetworkOnMainThreadException
 

Mariano Ismael Castro

Active Member
Licensed User

Hello, check this
Thread
 
Upvote 0

amarnath

Member
Licensed User
Longtime User
B4X:
Sub Activity_Resume
    B4XPages.Delegate.Activity_Resume
    DisableStrictMode
End Sub

Thanks. Problem solved.
 
Upvote 0

amarnath

Member
Licensed User
Longtime User
No. You are using a workaround.
The real solution is to switch to JdbcSQL and use its async methods.
can i use B4J server with RDC.
i use
Public mysql As JdbcSQL
Public driver As String = "com.mysql.jdbc.Driver"
'Public jdbcUrl As String = "jdbc:mysql://207.174.214.245:3000/amarn_d?characterEncoding=utf8" 'windows host
'Public jdbcUrl As String = "jdbc:mysql://208.91.198.26:3000/amarn_d?characterEncoding=utf8"
Public jdbcUrl As String = "jdbc:mysql://207.174.214.245:3000/amarn_d?useSSL=False&characterEncoding=utf8" 'lunix host


in future my customers more than 1000.
which is the best.
Please guide me.
 
Last edited:
Upvote 0
Cookies are required to use this site. You must accept them to continue using the site. Learn more…