Android Open Source - mobcomp-httpclient Load Activity






From Project

Back to project page mobcomp-httpclient.

License

The source code is released under:

Written by: Markus Tacker <m@coderbyheart.de> | http://coderbyheart.de/ Copyright (c) Markus Tacker Permission is hereby granted, free of charge, to any person obtaining a copy of this software and ...

If you think the Android project mobcomp-httpclient listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package de.hsrm.mi.mobcomp.httpclientdemo;
/*  ww w.  j a v a  2 s .c om*/
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import de.hsrm.mi.mobcomp.httpclientdemo.extra.IdFile;
import de.hsrm.mi.mobcomp.httpclientdemo.extra.ParameterRunnable;
import de.hsrm.mi.mobcomp.httpclientdemo.flickr.ImageLoader;
import de.hsrm.mi.mobcomp.httpclientdemo.flickr.RestAPI;
import de.hsrm.mi.mobcomp.httpclientdemo.flickr.SetsReader;
import de.hsrm.mi.mobcomp.httpclientdemo.flickr.SetsReader.Set;

/**
 * Demonstriert, wie man mit dem {@link HttpClient} Daten laden kann.
 * 
 * Verwendet dazu die flickr-API.
 * 
 * @see http://www.flickr.com/services/api/
 * 
 * @author Markus Tacker <m@coderbyheart.de>
 */
public class LoadActivity extends MenuActivity {
  private TextView loadingStatus;
  private Handler handler = new Handler();
  private String flickrAPIKey;
  private String flickrNSID;
  private ExecutorService pool;
  private RestAPI flickrAPI;
  private int threadPoolSize;
  private int numSets;
  private HashMap<String, ImageView> id2iv;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.load);

    // OAuth wird erstmal nicht verwendet, da das nicht zum Thema gehrt
    // daher verwenden wir den API-Key und User-ID
    // Eine eigenen API_key erhlt man unter:
    // http://www.flickr.com/services/api/keys/
    // Die NSID lsst sich z.B. mittels http://www.xflickr.com/fusr/
    // ermitteln
    SharedPreferences prefs = PrefsActivity.getPreferences(this);
    String keyFlickrAPIKey = getResources().getString(R.string.key_api_key);
    String keyFlickrNSID = getResources().getString(R.string.key_nsid);
    String keyThreadPoolSize = getResources().getString(
        R.string.key_threadpool_size);
    String keyNumSets = getResources().getString(R.string.key_num_sets);
    flickrAPIKey = prefs.getString(keyFlickrAPIKey, null);
    flickrNSID = prefs.getString(keyFlickrNSID, null);
    threadPoolSize = Integer.parseInt(prefs.getString(keyThreadPoolSize,
        "4"));
    numSets = Integer.parseInt(prefs.getString(keyNumSets, "20"));

    // Keine Einstellung vorhanden? Dann Konfigurieren.
    if (flickrAPIKey == null || flickrAPIKey.length() <= 0) {
      startActivity(new Intent(getApplicationContext(),
          PrefsActivity.class));
      Toast.makeText(getApplicationContext(),
          R.string.please_configure_api_key, Toast.LENGTH_LONG)
          .show();
      finish();
      return;
    }

    loadingStatus = (TextView) findViewById(R.id.loadingStatus);

    // Thread-Pool, der zum Laden von Fotos verwendet wird
    pool = Executors.newFixedThreadPool(threadPoolSize,
        Executors.defaultThreadFactory());

    // Erzeugt die URLs der flickr-API
    flickrAPI = new RestAPI(flickrAPIKey);

    // Liste der Sets laden
    loadSets();
  }

  /**
   * Aktualisiert die Statusanzeige unter dem Spinner
   * 
   * @param status
   */
  private void setStatus(final String status) {
    handler.post(new Runnable() {
      @Override
      public void run() {
        loadingStatus.setText(status);
      }
    });
  }

  /**
   * Ldt die Sets
   */
  private void loadSets() {
    new Thread(new Runnable() {
      @Override
      public void run() {
        setStatus("Loading sets from from flickr ...");
        Uri setsUri = flickrAPI.getPhotoSets(flickrNSID, 1, numSets);

        // HTTP-Client erzeugen
        HttpClient client = new DefaultHttpClient();

        // Wir machen einen GET-Request
        HttpGet request = new HttpGet(setsUri.toString());
        // mit request.setHeader(header, value) knnen beliebige Header
        // im Request gesetzt werden

        try {
          HttpResponse response = client.execute(request);

          // Http-Status auslesen
          StatusLine status = response.getStatusLine();
          if (status.getStatusCode() != 200) {
            throw new IOException("Invalid response from server: "
                + status.toString());
          }

          // Antwort auslesen und in String speichern
          HttpEntity entity = response.getEntity();
          InputStream inputStream = entity.getContent();
          ByteArrayOutputStream content = new ByteArrayOutputStream();
          int readBytes = 0;
          byte[] sBuffer = new byte[512];
          while ((readBytes = inputStream.read(sBuffer)) != -1) {
            content.write(sBuffer, 0, readBytes);
          }
          String dataAsString = new String(content.toByteArray());

          // In Datei speichern?
          // Siehe {@link ImageLoader#fetchImage(Uri source)}.

          setStatus("Sets loaded.");

          // Ergebnis auswerten
          setStatus("Parsing XML.");
          ArrayList<Set> sets = new SetsReader()
              .getSets(dataAsString);
          setStatus("XML parsed. " + sets.size() + " Sets loaded.");
          // Jetzt wieder zurck an den UI-Thread um die Sets an zu
          // zeigen
          handler.post(new ParameterRunnable<ArrayList<Set>>(sets) {
            @Override
            public void run() {
              showSets(getParameter());
            }

          });
        } catch (IOException e) {
          // Ein Problem in der HTTP-Kommunikation ist aufgetreten
          handler.post(new ParameterRunnable<String>(e.getMessage()) {
            @Override
            public void run() {
              Toast.makeText(getApplicationContext(),
                  getParameter(), Toast.LENGTH_LONG).show();
            }
          });
          Log.e(getClass().getCanonicalName(), e.getMessage());
        }
      }

    }).start();
  }

  /**
   * Zeigt eine Liste mit Sets an
   * 
   * @param sets
   */
  private void showSets(ArrayList<Set> sets) {
    // Layout ersetzen
    setContentView(R.layout.sets);
    LayoutInflater li = getLayoutInflater();
    LinearLayout setsListView = (LinearLayout) findViewById(R.id.sets);
    // Hier merken wir uns die flickr-ID und die ImageView, um spter das
    // geladene Bild in der richtigen ImageView setzen zu knnen.
    id2iv = new HashMap<String, ImageView>();
    for (Set set : sets) {
      LinearLayout setItem = (LinearLayout) li.inflate(
          R.layout.sets_item, setsListView, false);
      TextView setItemText = (TextView) setItem
          .findViewById(R.id.steItemTextView);
      setItemText.setText(set.title);
      setsListView.addView(setItem);
      // ImageView merken
      id2iv.put(set.primaryPhotoId,
          (ImageView) setItem.findViewById(R.id.steItemImageView));
      // Jetzt die Bilder ber den ThreadPool laden

      // Mit {@link IdFile} schleifen wir die ID des Sets durch alle
      // Threads durch
      IdFile idFile = new IdFile(set.primaryPhotoId);
      ParameterRunnable<IdFile> onComplete = new ParameterRunnable<IdFile>(
          idFile) {
        @Override
        public void run() {
          // Im IdFile ist jetzt die Datei des Thumbnails gesetzt
          handler.post(new ParameterRunnable<IdFile>(getParameter()) {
            @Override
            public void run() {
              // Image-View wieder finden ...
              ImageView setItemImage = id2iv.get(getParameter()
                  .getId());
              // Und Bild aus Datei setzen
              setItemImage.setImageBitmap(BitmapFactory
                  .decodeFile(getParameter().getFile()
                      .getAbsolutePath()));
            }
          });
        }
      };
      // Das Laden der Bilder geschieht im ThreadPool, damit wir nicht zu
      // viele Connections gleichzeitig haben
      ImageLoader il = new ImageLoader(flickrAPI, set.primaryPhotoId,
          onComplete);
      pool.execute(il);
    }
  }
}




Java Source Code List

de.hsrm.mi.mobcomp.httpclientdemo.FlickrAuthActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.LoadActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.MainActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.MenuActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.PrefsActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.SendActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.extra.IdFile.java
de.hsrm.mi.mobcomp.httpclientdemo.extra.ParameterRunnable.java
de.hsrm.mi.mobcomp.httpclientdemo.extra.ProgressMultipartEntity.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.AuthReader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.FrobReader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.ImageLoader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.RestAPI.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.SetsReader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.SizesReader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.UploadReader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.XmlReader.java