Android Tutorial Flickr Viewer

Status
Not open for further replies.
flickr_viewer1.png


This application gets this html page: Flickr: Explore interesting photos from the last 7 days in FlickrLand... , parses it and finds the 9 image links.
It then sends a request for each of the images. Downloaded images are then displayed in the ImageViews.
Each time you press on the Connect button 9 new images appear.
Pressing on an image shows it larger in a second activity (note that the full image is not downloaded so the second activity just shows the thumbnail with its original size).

If you run this program you can see that all requests are handled in the background and that images appear whenever they are ready.

The TaskId plays an important role here. Each image request is sent with a TaskId between 0 to 8. This TaskId is later used to get the correct ImageView from the ImageViews array.

B4X:
Sub Process_Globals
    Dim MainUrl As String
    MainUrl = "http://www.flickr.com/explore/interesting/7days/"
    Dim HttpClient1 As HttpClient
    Dim MainRequestId As Int
    MainRequestId = 100
    
End Sub

Sub Globals
    Dim btnConnect As Button
    Dim ImageView1 As ImageView
    Dim ImageView2 As ImageView
    Dim ImageView3 As ImageView
    Dim ImageView4 As ImageView
    Dim ImageView5 As ImageView
    Dim ImageView6 As ImageView
    Dim ImageView7 As ImageView
    Dim ImageView8 As ImageView
    Dim ImageView9 As ImageView
    Dim ivs() As ImageView
End Sub

Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        HttpClient1.Initialize("http")
    End If
    Activity.LoadLayout("1")
    ivs = Array As ImageView(ImageView1, ImageView2, ImageView3, ImageView4, _
        ImageView5, ImageView6, ImageView7, ImageView8, ImageView9)
    ResetImagesBackground
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
Sub ResetImagesBackground
    For i = 0 To Activity.NumberOfViews - 1
        If Activity.GetView(i) Is ImageView Then Activity.GetView(i).Color = Colors.Black
    Next
    'We could have used the image views array (ivs) instead of going over all the views...
End Sub

Sub btnConnect_Click
    Dim request As HttpRequest
    request.InitializeGet(MainUrl)
    HttpClient1.Execute(request, MainRequestId)
    ProgressDialogShow("Fetching data...")
End Sub

Sub Http_ResponseSuccess (Response As HttpResponse, TaskId As Int)
    Log(TaskId & ": success")
    If TaskId = MainRequestId Then 'Fetch the main page
        Response.GetAsynchronously("MainResponse", _ 
            File.OpenOutput(File.DirInternalCache, "page.html", False), True, MainRequestId)
    Else 'One of the images requests has arrived, write the image to a file in the background
        Response.GetAsynchronously("ImageResponse", _ 
            File.OpenOutput(File.DirInternalCache, "image" & TaskId, False), True, TaskId)
    End If
End Sub
Sub Http_ResponseError (Reason As String, StatusCode As Int, TaskId As Int)
    ToastMessageShow("Error. TaskId: " & TaskId & ", Reason: " & Reason & ", StatusCode: " & StatusCode, True)
    ProgressDialogHide
End Sub
'
Sub ImageResponse_StreamFinish (Success As Boolean, TaskId As Int)
    If Success = False Then
        Msgbox(LastException.Message, "Error")
        Return
    End If
    Dim bd As BitmapDrawable 'load the image 
    bd.Initialize(LoadBitmap(File.DirInternalCache, "image" & TaskId)) 
    ivs(TaskId).Background = bd 'set the image to an ImageView
End Sub

Sub MainResponse_StreamFinish (Success As Boolean, TaskId As Int)
    ResetImagesBackground
    HandleMainPage (File.OpenInput(File.DirInternalCache, "page.html"))
End Sub
'Parse the main page and find the 9 image links
Sub HandleMainPage (in As InputStream)
    start = DateTime.Now
    Dim TextReader1 As TextReader
    TextReader1.Initialize(in)
    Dim pattern, class As String
    class = "<td class=" & QUOTE & "Photo" & QUOTE & ">"
    pattern = "img src=\q([^q]+)\q".Replace("q", QUOTE)
    Dim links As List
    links.Initialize
    Dim line As String
    line = TextReader1.ReadLine
    Do While line <> Null
        If line.IndexOf(class) > -1 Then
            Dim link As String
            Dim m As Matcher
            m = Regex.Matcher(pattern, line)
            If m.Find Then
                links.Add(m.Group(1)) 'add the image link
            End If
        End If
        line = TextReader1.ReadLine
    Loop
    TextReader1.Close
    Log("done parsing main page: " & (DateTime.Now - start))
    For i = 0 To links.Size - 1 'send request for each image
        Dim request As HttpRequest
        request.InitializeGet(links.Get(i))
        HttpClient1.Execute(request, i)
    Next
    ProgressDialogHide
End Sub

'Show the second activity with the chosen image.
Sub img_Click
    Dim iv As ImageView
    iv = Sender
    Dim bd As BitmapDrawable
    bd = iv.Background
    Activity2.Bitmap1 = bd.Bitmap
    StartActivity(Activity2)
End Sub

A new version of FlickrViewer is available based on HttpUtils: http://www.b4x.com/forum/basic4andr...ndroid-web-services-now-simple.html#post50919
The new code is simpler and more robust.
 

Attachments

  • FlickrViewer.zip
    7.2 KB · Views: 1,875

addi

Member
Nice one!Do you perhaps have a example how to invoke the browser to display content of the webpage in your program?
Thanks
 

addi

Member
thanks!so this will be more like a shortcut if im correct that opn the page in the browser?
 

yiankos1

Well-Known Member
Licensed User
Longtime User
Sorry for bumping that old post.
How can you dim imageviews as many as images are at a "site"? First to check how many are the images at site and then dim the same number of imageviews in order to load that images.(not only 9 imageviews)
 
Status
Not open for further replies.
Top