Spanish Mostrar imagenes url

Jorgelcr

Active Member
Licensed User
Longtime User
Hola,

Ya había visto este codigo, mi problema es que intento descargar la imagen dentro de otro bucle que esta mostrado los registros. Me explico:

Tengo una tabla-> Empresas con tres campos(Nombre,Localidad,Logo) En el campo logo guardo la ruta ftp del archivo que he subido.

Creo un bucle para recorrer las empresas y muestro en un listview su Nombre y Localidad. Miro si el campo logo está vacío y en caso de no estar vacío quiero descargar la imagen y mostrarla. Tan fácil y tan complicado.

B4X:
Select job.JobName
        Case "Job1"
            If job.Success Then
                Dim res As String
                res = job.GetString
                Log("Response from server: " & res)
                Dim parser As JSONParser
                parser.Initialize(res)
                COUNTRIES = parser.NextArray 'returns a list with maps
                For i = 0 To COUNTRIES.Size - 1 'bucle para recorrer los registros de la tabla
                    m = COUNTRIES.Get(i)    
                    If m.Get("logo")=Null Then 'comprobar si tiene logo
                        ListView1.AddTwoLines(m.Get("Nombre"),"Lat: " & m.Get("Latitud")& "-" & "Long: " &  m.Get("Longitud"))
                    Else
                       'Descargar logo
                        imageurl2 = "http://www.miweb.com/logo/" & m.Get("logo")
                        json.Initialize(job.GetString)
                        job2.Initialize("Image",Me)
                        job2.Download(imageurl2)
                     
                    
                    End If
                Next
            End If    
        Case "Image"
           'Mostrar logo en Listview ListView1.AddTwoLinesAndBitmap(m.Get("Nombre"),m.Get("Localidad"),job2.GetBitmap)
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola jorge:

Con solo ese código es dificil saber cual es el problema, por que ademas no se sabe en que sub estas, parece como si estuviera en el evento cuando te has bajado un fichero, por lo del job.Success .
Supongo que estas empleando la libreria Httputils2, al hacer el job2.Initialize("Image",Me) por lo tanto, debes crear un sub, para ese evento:
B4X:
Sub JobDone(job As HttpJob)

En este sub tienes que mirar que el evento "Image" se cumple, luego que se lo ha bajado y grabar la imagen:

B4X:
Sub JobDone(job As HttpJob)

   If job.JobName="Image" then 
       if job.Success Then 
           ' imagen bajada
           Dim b As Bitmap
           b = job.GetBitmap
          ' luego asignas la imagen a donde quieras Activity.SetBackgroundImage(b)
       else
           ' imagen, error al bajarla
       end if  

   end if

Si ese código lo has metido dentro del Sub JobDone(job As HttpJob), lo mejor es que lo saques y lo llames desde otro sitio, ya que crear llamadas recursivas te pueden dar problemas.
Si te vas a bajar varias imágenes, te recomiendo que utilices el OkHttpClient de la libreria OkHttp, lo metas en un servicio y en el evento controles las bajadas de imágenes, Erel tiene varios ejemplos de esto.



Saludos
 

Jorgelcr

Active Member
Licensed User
Longtime User
Hola,

Te muestro el código entero:

B4X:
Sub Activity_Create(FirstTime As Boolean)
  
    Activity.LoadLayout("logos")

  
    ExecuteRemoteQuery("Select * From Empresas " , "EMPRESAS")
  
   
End Sub
Sub ExecuteRemoteQuery(Query As String, JobName As String)
 
    job1.Initialize("Job1", Me)
    job1.PostString("http://www.miweb.com/empresas.php", Query)
 
     
 
End Sub
Sub JobDone(job As HttpJob)

Select job.JobName
        Case "Job1"
            If job.Success Then
                Dim res As String
                res = job.GetString
                Log("Response from server: " & res)
                Dim parser As JSONParser
                parser.Initialize(res)
                COUNTRIES = parser.NextArray 'returns a list with maps
                For i = 0 To COUNTRIES.Size - 1 'bucle para recorrer los registros de la tabla
                    m = COUNTRIES.Get(i) 
                    If m.Get("logo")=Null Then 'comprobar si tiene logo
                        ListView1.AddTwoLines(m.Get("Nombre"),"Lat: " & m.Get("Latitud")& "-" & "Long: " &  m.Get("Longitud"))
                    Else
                       'Descargar logo
                        imageurl2 = "http://www.miweb.com/logo/" & m.Get("logo")
                        json.Initialize(job.GetString)
                        job2.Initialize("Image",Me)
                        job2.Download(imageurl2)
                  
                 
                    End If
                Next
            End If 
        Case "Image"
           'Mostrar logo en Listview ListView1.AddTwoLinesAndBitmap(m.Get("Nombre"),m.Get("Localidad"),job2.GetBitmap)
End Select
End Sub
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Jorge:

Puedes poner el codigo que te dije en el "Case Image", como la bajas en el "case job1" volverá a entrar de nuevo cuando se la baje, lo único que haciendo varias llamadas de bajarte imagenes, o cambias el nombre en el initialize, o cuando se baje la imagen no sabras a cual corresponde.

Te vuelvo a decir lo mismo; si te vas a bajar varias imágenes, te recomiendo que utilices el OkHttpClient de la libreria OkHttp, lo metas en un servicio y en el evento controles las bajadas de imágenes, Erel tiene varios ejemplos de esto, este entre otros:

https://www.b4x.com/android/forum/threads/download-huge-files-with-httputils2.30220/#content

Saludos
 

Jorgelcr

Active Member
Licensed User
Longtime User
Hola,

He mirado el ejemplo de Erel que me comentas, descargo el archivo pero en dd_Complete pongo ImageView1.Bitmap=Job.GetBitmap y me da error porque no encuentra la ruta donde lo descarga.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

En el ejemplo de Erel, donde se descarga los ficheros es en TempFolder = File.DirInternalCache , está declarado en el módulo de servicio HttpUtils2Service

Como es una variable pública, podras acceder a ella asi:

B4X:
NombreCarpetaFichero = HttpUtils2Service.TempFolder


Saludos
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Jorge, resolviste el problema? es para que le añadas al título [SOLUCIONADO] o si encontraste la solución y era otra la expongas.

Gracias

Saludos
 

rscheel

Well-Known Member
Licensed User
Longtime User
Estimado con picasso puede realizar lo que esta buscando.

primero que nada tiene que descargar picasso.jar y colocarlo en su carpeta de librerias adicionales.

B4X:
#Region Extras
    #AdditionalJar: picasso-2.5.2
#End Region


B4X:
Sub Globals
 
    Private ImageView1 As ImageView

End Sub

B4X:
ImageView1.Initialize("ImageView1")
                        GetPicasso.RunMethodJO("load", Array("http://i.imgur.com/DvpvklR.png")).RunMethodJO("into", Array(ImageView1))
                        ImageView1.Gravity = Gravity.FILL

B4X:
Sub GetContext As JavaObject
   Return GetBA.GetField("context")
End Sub

Sub GetBA As JavaObject
  Dim jo As JavaObject
  Dim cls As String = Me
  cls = cls.SubString("class ".Length)
  jo.InitializeStatic(cls)
  Return jo.GetFieldJO("processBA")
End Sub

Sub GetPicasso As JavaObject
   Dim jo As JavaObject
   'com.squareup.picasso.Picasso.with(context)
   Return jo.InitializeStatic("com.squareup.picasso.Picasso").RunMethod("with", Array(GetContext))
End Sub


Par mas información vea el tutorial de erel

https://www.b4x.com/android/forum/t...onaljar-and-javaobject-picasso.40904/#content
 
Last edited:
Top