Android Question Httputils2 issue when pulling an image that isn't there

Discussion in 'Android Questions' started by boastrike, Feb 25, 2015.

  1. boastrike

    boastrike Member Licensed User

    I am experiencing a problem downloading product images.

    Our solution uses images from a website located at a URL path that ends in the item number. There are thousands of item numbers and images and we don't know in advance if the image actually exists at the provided path as we don't manage the images.

    The majority of calls to download a product image succeed without issue. However, there are cases which nothing exists at the provided path.

    In a case where nothing exists at the URL path, one of two things happens. Sometimes, the try catch statements around the block of code setting the image in JobDone, fires and there are no issues; a placeholder image indicating the image could not be found is loaded. However, sometimes, even when downloading the same image, there is some issue and the application closes with a message indicating the application stopped working.

    I have attempted to debug the issue, however, the debugger does not fire; the issue may be in an async process that does not handle it in a way the debugger can catch, of course there may be other explanations to the issue as well. It seems the issue is in the HttpJob or HttpUtils2 itself.

    We are trying to keep the the application from closing if an image is not there. There are try catches in the JobDone sub, as well as a check too see if the HttpJob was successful (200....) Please provide feedback on how we may resolve the issue. I can look over HttpJob or HttpUtils2 if required. I know they used to be modules where we could see the code. Any feedback is welcome.

    Thanks for your time! Boa
     
  2. KZero

    KZero Active Member Licensed User

    Can you post the relevant part of code ?
     
  3. boastrike

    boastrike Member Licensed User

    This is the code that instantiates and initializes the HttpJob
    Code:
    Dim imagepath As String
                            imagepath = 
    "http://www.europasports.com/media/catalog/250/" & edtItem.Text & ".jpg"
                            
    Try
                                
    Dim jobDownloadImage As HttpJob
                                  jobDownloadImage.Initialize(
    "jobDownloadImage",Me)
                                jobDownloadImage.Download(imagepath)
                            
    Catch
                                
    Dim rsie As RSImageEffects
                                
    Dim adHoc As Bitmap
                                adHoc.Initialize(
    File.DirAssets,"no_image.jpg")
                                PanelQtyImage.Bitmap = rsie.RoundCorner(adHoc, 
    20)
                            
    End Try
    Here is the code from JobDone that handles the request.

    Code:
    Sub JobDone (Job As HttpJob)
        
    Log("JobName = " & Job.JobName & ", Success = " & Job.Success)
        
    ProgressDialogHide
        
    If Job.Success = True Then
            
    Select Job.JobName
    Case "jobDownloadImage"
                    
    Try
                        
    Dim rsie As RSImageEffects
                        PanelQtyImage.Bitmap = rsie.RoundCorner(Job.GetBitmap, 
    20)
                    
    Catch
                        
    Dim rsie As RSImageEffects
                        
    Dim adHoc As Bitmap
                        adHoc.Initialize(
    File.DirAssets,"no_image.jpg")
                        PanelQtyImage.Bitmap = rsie.RoundCorner(adHoc, 
    20)
                    
    End Try
            
    End Select
    For the edtItem.Text in imagepath

    works -> 851780003770 OR https://www.europasports.com/media/catalog/250/851780003770.jpg as imagepath

    breaks -> 081950001958 OR https://www.europasports.com/media/catalog/250/081950001958.jpg as imagepath
     
  4. KMatle

    KMatle Expert Licensed User

    There is a message coming back from the server (not found = 404) and Job.Success is false

    Code:
    If Job.Success = True Then
        ...
    Else
          
    Log("Error: " & Job.ErrorMessage)
          
    ToastMessageShow("Error: " & Job.ErrorMessage, True)
          
    Msgbox(Job.jobname & ": " & Job.ErrorMessage,"Error")

       
    End If
       Job.Release
    In "else" = Job fails you can check it and decide what to do. Parse "Job.ErrorMessage" for 404.

    There is no need to try&catch the send of a job (this works anyway).

    A missing image sounds like a logic problem.
     
  5. KZero

    KZero Active Member Licensed User

    the httputils2service crashes before firing Jobdone


    Code:
    PackageAdded: package:b4a.example
    ** 
    Activity (main) Create, isFirst = true **
    Create Finished
    ** 
    Activity (main) Resume **
    ** 
    Service (httputils2service) Create **
    ** 
    Service (httputils2service) Start **
    Failed 
    to read error message.
    java.lang.RuntimeException: android.os.NetworkOnMainThreadException
        at anywheresoftware.b4a.BA.raiseEvent2(BA.java:
    213)
        at anywheresoftware.b4a.BA$
    3.run(BA.java:332)
        at android.os.Handler.handleCallback(Handler.java:
    733)
        at android.os.Handler.dispatchMessage(Handler.java:
    95)
        at android.os.Looper.loop(Looper.java:
    146)
        at android.app.ActivityThread.main(ActivityThread.java:
    5752)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:
    515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:
    1291)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:
    1107)
        at dalvik.system.NativeStart.main(Native Method)
    Caused by: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:
    1166)
        at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:
    739)
        at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:
    103)
        at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:
    191)
        at org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:
    220)
        at org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:
    183)
        at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:
    155)
        at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:
    175)
        at org.apache.http.impl.io.ChunkedInputStream.exhaustInputStream(ChunkedInputStream.java:
    289)
        at org.apache.http.impl.io.ChunkedInputStream.close(ChunkedInputStream.java:
    262)
        at org.apache.http.entity.BasicHttpEntity.consumeContent(BasicHttpEntity.java:
    142)
        at org.apache.http.conn.BasicManagedEntity.consumeContent(BasicManagedEntity.java:
    114)
        at anywheresoftware.b4a.http.HttpClientWrapper$HttpResponeWrapper.Release(HttpClientWrapper.java:
    531)
        at anywheresoftware.b4a.samples.httputils2.httputils2service._hc_responseerror(httputils2service.java:
    120)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:
    515)
        at anywheresoftware.b4a.BA.raiseEvent2(BA.java:
    187)
        ... 
    10 more
    #1 setTransGradationModeColor false
    ** 
    Activity (main) Resume **
     
  6. boastrike

    boastrike Member Licensed User

    Thanks very much for your response. We appreciate your time and consideration. However, I do not think what you outlined is the problem.
    The code actually accounts for this. However, it is a large app and I do not wish to post all the code here. As an example, here is the code that catches the issue.

    Code:
    Else
            
    If Job.JobName <> "jobDownloadImage" Then
               
    Log("Error: " & Job.ErrorMessage)
               
    ToastMessageShow("Error: " & Job.ErrorMessage, True)
                
    Msgbox("Network connection error, please retry","Network Connection Issue")
                
    ProgressDialogHide
                ShowLoginPanel
            
    Else
                
    Dim rsie As RSImageEffects
                
    Dim adHoc As Bitmap
                adHoc.Initialize(
    File.DirAssets,"no_image.jpg")
                PanelQtyImage.Bitmap = rsie.RoundCorner(adHoc, 
    20)
            
    End If
        
    End If
    Also it should be noted, when debugging, if a break point is set at the first if statement of JobDone, the if statement in the original post. The break point is never reached; the app is breaking before JobDone is even called.
     
  7. boastrike

    boastrike Member Licensed User


    You are absolutely correct. Thanks for your time and consideration!
     
  8. KMatle

    KMatle Expert Licensed User

    My Server responds like that:

    Code:
    ** Activity (main) Resume **
    ** 
    Activity (main) Pause, UserClosed = false **
    ** 
    Activity (main) Create, isFirst = true **
    ** 
    Activity (main) Resume **
    ** 
    Service (httputils2service) Create **
    ** 
    Service (httputils2service) Start **
    GC_CONCURRENT freed 394K, 
    12% free 7332K/8263K, paused 4ms+1ms, total 25ms
    JobName = Ping, Success = 
    true
    Ready

    Loading 
    Image: http://192.168.178.21/image/uploads/20140822_xxxx.jpg
    <?xml version=
    "1.0" encoding="UTF-8"?>

    <!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

      
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

    <html xmlns=
    "http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

    <head>

    <title>Object 
    not found!</title>

    <link rev=
    "made" href="mailto:postmaster@localhost" />

    <style 
    type="text/css"><!--/*--><![CDATA[/*><!--*/

        body { color: 
    #000000; background-color: #FFFFFF; }

        a:link { color: 
    #0000CC; }

        p, 
    address {margin-left: 3em;}

        span {font-size: smaller;}

    /*]]>*/--></style>

    </head>



    <body>

    <h1>Object not found!</h1>

    <p>





        The requested URL was not found on this server.



     



        If you entered the URL manually please check your

        spelling and try again.



     



    </p>

    <p>

    If you think this is a server error, please contact

    the <a href="mailto:postmaster@localhost">webmaster</a>.



    </p>



    <h2>Error 404</h2>

    <address>

      <a href="/">192.168.178.21</a><br />

      <span>Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3</span>

    </address>

    </body>

    </html>
    It seems that your server terminates the connection (I clicked the link). It does not respnd with "not found". Maybe a settings issue?
     
    boastrike and KZero like this.
  9. boastrike

    boastrike Member Licensed User

    This is a clients server. You are right in that a 404 is not being returned. There is an ERR_CONNECTION_RESET being thrown by chrome, which is a way of saying something went wrong (no details). I will suggest the client review their server configuration.

    I am hoping b4a can handle this kind of situation. Possible update to HttpUtils.

    Thanks very much for your response! Your user image makes me crave a beer!
     
    Last edited: Feb 25, 2015
  10. KZero

    KZero Active Member Licensed User

    this may be temporary solution

    use HTTP library

    Code:
    Sub Process_Globals
    Dim hc As HttpClient
    End Sub

    Sub Activity_Create(FirstTime As Boolean)  
        
    If FirstTime=True Then hc.Initialize("hc")  
    End Sub

    Sub CheckURL(aURL As String)
    Dim Req As HttpRequest
        Req.InitializeHead(aURL)
        hc.Execute(Req, 
    1)
    End Sub

    Sub hc_ResponseSuccess (Response As HttpResponse, TaskId As Int)
    Log("Link is ok")
    'now call httputils2 to download the image
    End Sub
    Sub hc_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int)
    Log("Link not valid!")
    End Sub
     
    KMatle and boastrike like this.
  11. boastrike

    boastrike Member Licensed User

    Works like a charm as a temp fix! Great response KZero, thanks so much for your help in getting a solution this issue. You Rock!
     
    KMatle and KZero like this.
  12. KMatle

    KMatle Expert Licensed User

    I do think it's for safety reasons, so the "temporary solution" IS the solution in many cases.
     
    boastrike and KZero like this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice