Italian Stranezza con HttpUtil e download immagini e file

mrwebbit

Member
Licensed User
Longtime User
Salve a tutti

ho un piccolo problema con HTTPUTIL

cosa dovrei fare:
1) leggere un file/pagina php da un sito che mi restituisce un testo (tipo link completo ad un immagine tipo: http_www_miosito_com_immagine.jpg

2) letto il file scaricare quel file e salvarlo in locale

3) assegnare la bitmap locale ad una ImageView

Le 3 cose separate grazie ai numerosi template sul forum nessun problema, il problema c'è quando tento di farle una in fila all'altra per esempio all'evento click di un bottone o come sarà alla fine del progetto in un loop dentro un service.

Il codice qui sotto è quello che ho usato ma cosa strana che mi restituisce è la seguente:
al 1° clic non fa nulla (non legge neppure la variabile controllo con il LOG())
al 2° clic legge il testo contenuto nel file/pagina php
al 3° clic scarica l'immagine e la assegna al ImageView

è normale? mettendoli in successione non dovrebbe eseguirli nell'ordine ad 1 solo click senza premere 3 volte lo stesso bottone?

grazie. MWB

B4X:
Sub HttpClient1_ResponseSuccess (Response As HttpResponse, TaskId As Int)

   Response.GetAsynchronously("ImageResponse", File.OpenOutput(File.DirInternal, "cane.jpg", False), True, TaskId)
   
End Sub

Sub HttpClient2_ResponseSuccess (Response As HttpResponse, TaskId As Int)

   result = Response.GetString("UTF8")
   Log(result)
   
End Sub

Sub ImageResponse_StreamFinish (Success As Boolean, TaskId As Int)

   ImageView1.Bitmap = LoadBitmap(File.DirInternal,"cane.jpg")

End Sub



Sub legge
   
   Dim request As HttpRequest
   request.InitializeGet("http_www_miosito_com_file.txt")
   HttpClient2.Execute(request, 2)

   request.InitializeGet(result)
   HttpClient1.Execute(request, 1)
   
End Sub
 

mrwebbit

Member
Licensed User
Longtime User
quella parte non l'ho postata

ho un Button e sull'evento click richiamo il "legge" che dovrebbe scaturire il tutto


Parte omessa il precedente Post:
B4X:
Sub Process_Globals
    
   Dim HttpClient1 As HttpClient
   Dim HttpClient2 As HttpClient
   Dim result As String
   
End Sub

Sub Globals
   Dim ImageView1 As ImageView
   Dim Button3 As Button
   Dim Button1 As Button
End Sub

Sub Activity_Create(FirstTime As Boolean)
    
 If FirstTime Then
     HttpClient1.Initialize("HttpClient1")
    HttpClient2.Initialize("HttpClient2")
 End If
   
   Activity.LoadLayout("home")


End Sub

.
.
.
.

Sub Button1_Click
   legge
End Sub
 

mrwebbit

Member
Licensed User
Longtime User
ho provato anche ad inserire un ciclo di attesa [do/loop] fra un comando e l'altro, le pause (attesa) le fa ma il risultato è sempre il medesimo, i soliti 3 clic
 

genesi

Active Member
Licensed User
Longtime User
ho provato anche ad inserire un ciclo di attesa [do/loop] fra un comando e l'altro, le pause (attesa) le fa ma il risultato è sempre il medesimo, i soliti 3 clic

Forse dovresti usare gli eventi che vengono richiamati.
HttpUtils raises two types of events while processing a job. The UrlDone event is raised for each successful download with the downloaded url and the JobDone event is raised when the whole job finishes.
You cannot submit a new job while a current job is running (though a job can contain many links).

Mario
 

worm

Member
Licensed User
Longtime User
Ciao,
con HttpUtils2 diventa molto semplice..
guarda il progetto allegato, dovrebbe fare esattamente quello che chiedi :)
 

Attachments

  • getphoto.zip
    9.2 KB · Views: 331

mrwebbit

Member
Licensed User
Longtime User
Ho provato anche con HttpUtils, ma con HttpUtils2 è davvero più semplice

ho aggiunto la possibilità di salvare l'immagine sul Device in modo da poterla riutilizzare offline o in un secondo tempo aggiungendo:

B4X:
Dim out As OutputStream
out = File.OpenOutput(File.DirInternal,"immaginescaricata.jpg",False)
File.Copy2(Job.GetInputStream,out)
out.close

è possibile lanciare questo evento "CLIC" che legge e scarica direttamente in un service "looppandolo" 1 volta all'ora? (ovviamente con App anche chiusa)
per il Timer è semplice ma non posso richiamare la SUB nel Main dal Service perchè una volta chiusa l'APP il Service continua a looppare ma non esegue la Sub nel Main.

MWB
 

mrwebbit

Member
Licensed User
Longtime User
grazie,

ho dovuto però aggiornare all'ultima versione 2.25 altrimenti mi dava errore quando mettevo lo script in una SERVICE.

ora ho messo:
B4X:
Sub Activity_Create(FirstTime As Boolean)
   
   If FirstTime Then
      StartService(downloadsrv)
   End If 
....

è plausibile mettere:
B4X:
Sub Service_Start (StartingIntent As Intent)
Dim job1 As HttpJob
job1.Initialize("Job1", Me)
job1.Download("http://www.miosito.it/leggeimmagine.php")


StartServiceAt("", DateTime.Now + 10 * 1000, True)

End Sub

una StartServiceAt (come nell'esempio ogni 10 secondi) per rilanciare la service al completamento delle operazioni e così creare un Loop?
oppure c'è una procedura meno "sporca" ?

MWB
 

worm

Member
Licensed User
Longtime User
grazie,

ho dovuto però aggiornare all'ultima versione 2.25 altrimenti mi dava errore quando mettevo lo script in una SERVICE.

ora ho messo:
B4X:
Sub Activity_Create(FirstTime As Boolean)
   
   If FirstTime Then
      StartService(downloadsrv)
   End If 
....

è plausibile mettere:
B4X:
Sub Service_Start (StartingIntent As Intent)
Dim job1 As HttpJob
job1.Initialize("Job1", Me)
job1.Download("http://www.miosito.it/leggeimmagine.php")


StartServiceAt("", DateTime.Now + 10 * 1000, True)

End Sub

una StartServiceAt (come nell'esempio ogni 10 secondi) per rilanciare la service al completamento delle operazioni e così creare un Loop?
oppure c'è una procedura meno "sporca" ?

MWB

Hai davvero bisogno che scarichi l'immagine ogni 10 secondi?!?
Questo aumenterebbe di molto i dati usati dal cellulare (a meno che non usi il wifi).

Per creare il loop puoi modificare il codice nel modo seguente:
B4X:
Sub JobDone (Job As HttpJob)
   Dim job3 As HttpJob
   Dim job1 As HttpJob

   ' visualizza il risultato del job corrente
   Log("JobName = " & Job.JobName & ", Success = " & Job.Success)

   If Job.Success = True Then
      Select Job.JobName
         Case "Job1"
            ' salva la string
            immagine = Job.GetString
            ' scarica l'immagine
            job3.Initialize("Job3", Me)
            job3.Download(immagine)
         Case "Job3"
            'show the downloaded image
            ImageView1.Bitmap = Job.GetBitmap
            'richiama job 1, crea un loop continuo
            job1.Initialize("Job1", Me)
            job1.Download("http://android.mushiware.ch/photo.php")
      End Select
   Else
      Log("Error: " & Job.ErrorMessage)
      ToastMessageShow("Error: " & Job.ErrorMessage, True)
   End If
   Job.Release
End Sub

Non ho testato il codice, ma in questo modo l'immagine viene scaricata di continuo (sarebbe opportuno mettere un qualche controllo per bloccare il tutto se necessario)
 
Top