85
HTTP and Threads

HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Embed Size (px)

Citation preview

Page 1: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP and Threads

Page 2: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Getting Data from the Web

• Believe it or not, Android apps are able to pull data from the web.

• Developers can download bitmaps and text and use that data directly in their application.

Page 3: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

How to use HTTP with Android

1. Ask for permission

2. Make a connection

3. Use the data

Page 4: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Step 1: Ask for Permission

• An application’s Android Manifest specifies which permissions are needed in order for the application to run.

• For application wanting to access the internet, it must list that permission in its Manifest.

Page 5: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Step 1: Ask for Permission

• Open your project’s AndroidManifeset.xml

Add the following xml:<uses-permission android:name="android.permission.INTERNET"/>

Page 6: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Step 1: Ask for Permission<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidhttp" android:versionCode="1" android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.androidhttp.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>

</manifest>

Page 7: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Permission

• When a user downloads an app from the Android Play Store, they’ll have to accept and agree to all permissions required by the app before it is installed.

• Usually users don’t read the small text and just agree, but it’s still good to know.

Page 8: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Don’t forget to ask

• If you fail to add the permission to your AndroidManifest.xml you will NOT get a runtime or compile time error.

• Your application will simply fail to connect to the internet.

Page 9: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Step 2: Make a connectionBitmap img = null;URL url;try { //A uniform resource locator aka the place where the data is //located url = new URL("http://theheroicage.com/wp- content/uploads/2011/04/deadpool-team-up-887-cover-art.jpg"); //Opens an HTTPUrlConnection and downloads the input stream into a //Bitmap img = BitmapFactory.decodeStream(url.openStream());} catch (MalformedURLException e) { Log.e("CRR", "URL is bad"); e.printStackTrace();} catch (IOException e) { Log.e("CRR", "Failed to decode Bitmap"); e.printStackTrace();}mImage.setImageBitmap(img);

Page 10: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Using a URL to create a Bitmap url = new URL("http://theheroicage.com/wp- content/uploads/2011/04/deadpool-team-up-887-cover-art.jpg");

//Opens an HTTPUrlConnection and downloads the input stream into a //Bitmapimg = BitmapFactory.decodeStream(url.openStream());

Page 11: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Step 3: Use the dataBitmap img = null;URL url;try { //A uniform resource locator aka the place where the data is //located url = new URL("http://theheroicage.com/wp- content/uploads/2011/04/deadpool-team-up-887-cover-art.jpg"); //Opens an HTTPUrlConnection and downloads the input stream into a //Bitmap img = BitmapFactory.decodeStream(url.openStream());} catch (MalformedURLException e) { Log.e("CRR", "URL is bad"); e.printStackTrace();} catch (IOException e) { Log.e("CRR", "Failed to decode Bitmap"); e.printStackTrace();}mImage.setImageBitmap(img);

Page 12: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Full Code for Making a ConnectionBitmap img = null;URL url;try { //A uniform resource locator aka the place where the data is //located url = new URL("http://theheroicage.com/wp- content/uploads/2011/04/deadpool-team-up-887-cover-art.jpg"); //Opens an HTTPUrlConnection and downloads the input stream into a //Bitmap img = BitmapFactory.decodeStream(url.openStream());} catch (MalformedURLException e) { Log.e("CRR", "URL is bad"); e.printStackTrace();} catch (IOException e) { Log.e("CRR", "Failed to decode Bitmap"); e.printStackTrace();}mImage.setImageBitmap(img);

Page 13: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Convert Bitmap to Drawableimg = BitmapFactory.decodeStream(url.openStream());Drawable d = new BitmapDrawable(img);

Page 14: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Decode Bitmap from stream

• http://stackoverflow.com/a/5776903/1222232

Page 15: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Your Turn!

• Create an Android application that uses a URL to create a Bitmap and place that Bitmap as the source of an ImageView.

Page 16: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

NetworkOnMainThreadException

• The exception that is thrown when an application attempts to perform a networking operation on its main thread.

Page 17: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Single Threaded

• When launching your Android application, a single system process with a single thread of execution is spawned.

• By default your app has 1 process and 1 thread.

Page 18: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

UI Thread

• That single thread has several names:– main application thread– main user interface thread– main thread– user interface thread

• Mostly known as the UI Thread

Page 19: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Why UI Thread

• This is the thread where the following occurs– Layout– Measuring– Drawing– Event handling– Other UI related logic

• A developer should use the UI Thread for UI

Page 20: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Blocking the UI Thread

• Anytime a long running operation takes place on the UI thread, UI execution is paused.

• While paused, your app can’t:– Handle Events– Draw– Layout– Measure

Page 21: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

UI Thread Execution

Handle Touch Events

MeasureLayoutDraw

UI Thread

Page 22: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

UI Thread Execution with HTTP Request

Handle Touch Events

MeasureLayoutDraw

UI Thread

Internet

Page 23: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

ANR (Activity Not Responding) Error

Happens when your UI Thread is paused/blocked too long.

Page 24: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Operations to avoid on UI Thread

• HTTP Request

• Database Querying

• File download/upload

• Image/Video Processing

Page 25: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

How to prevent ANR?

• Let the UI thread do UI logic to allow it to stay responsive and allow interaction with the user.

• Use a separate thread for all other things!

Page 26: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Threading in Android

• Android supports:– Threads– Thread pools– Executors

• If you need to update the user interface, your new thread will need to synchronize with the UI thread.

Page 27: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

2 ways to thread and synchronize

• Handler• AsyncTask

Page 28: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Handler

• A mechanism that allows a worker thread to communicate with the UI Thread in a thread-safe manner.

• Use a Handler to send and process– Messages (a data message)– Runnables (executable code)

Page 29: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

AsyncTask

• Allows you to perform asynchronous work on the UI Thread

• Performs blocking operations on the worker thread

• Working thread then publishes results to UI Thread.

Page 30: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

AsyncTasks are Easier Than Handlers

• AsyncTasks were designed as a helper class around Thread and Handler

• You don’t have to personally handle– Threads– Handlers– Runnables

Page 31: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

AsyncTask basics

1. Create a class that subclasses AsyncTask

2. Specify code to run on the worker thread

3. Specify code to update your UI

Page 32: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

UI Thread Execution with AsyncTask

Handle Touch Events

MeasureLayoutDraw

UI Thread

Spawn Thread Do Time Consuming Operation

Synchronize with UI Threadwith results

Page 33: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

AsyncTask Examplepublic void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png");}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { /** The system calls this to perform work in a worker thread and * delivers it the parameters given to AsyncTask.execute() */ protected Bitmap doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); } /** The system calls this to perform work in the UI thread and delivers * the result from doInBackground() */ protected void onPostExecute(Bitmap result) { mImageView.setImageBitmap(result); }}

Page 34: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

1. Subclass AsyncTaskpublic void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png");}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { /** The system calls this to perform work in a worker thread and * delivers it the parameters given to AsyncTask.execute() */ protected Bitmap doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); } /** The system calls this to perform work in the UI thread and delivers * the result from doInBackground() */ protected void onPostExecute(Bitmap result) { mImageView.setImageBitmap(result); }}

1

Page 35: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

2. Specify code for worker threadpublic void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png");}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { /** The system calls this to perform work in a worker thread and * delivers it the parameters given to AsyncTask.execute() */ protected Bitmap doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); } /** The system calls this to perform work in the UI thread and delivers * the result from doInBackground() */ protected void onPostExecute(Bitmap result) { mImageView.setImageBitmap(result); }}

2

Page 36: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

3. Specify code to update UI public void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png");}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { /** The system calls this to perform work in a worker thread and * delivers it the parameters given to AsyncTask.execute() */ protected Bitmap doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); } /** The system calls this to perform work in the UI thread and delivers * the result from doInBackground() */ protected void onPostExecute(Bitmap result) { mImageView.setImageBitmap(result); }}

3

Page 37: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

doInBackground()

• Triggered by calling the AsyncTask’s execute() method.

• Execution takes places on a worker thread

• The result of this method is sent to onPostExecute()

Page 38: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

onPostExecute()

• Invoked on the UI thread

• Takes the result of the operation computed by doInBackground().

• Information passed into this method is mostly used to update the UI.

Page 39: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

AsyncTask Parameters extends AsyncTask<Boolean, Point, MotionEvent>

• The three types used are:1. Params, the type of parameter sent to the task upon execution.

2. Progress, the type of progress units published during the background execution.

3. Result, the type of result of the background computation.

Page 40: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

AsyncTask Parameters

• Each AysncTask parameters can be any generic type

• Use whichever data type fits your use case.

• Not all parameters need to be used. To mark a parameters as unused, use the type Void.

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

Page 41: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Your turn with AsyncTask

• Create a AsyncTask that uses a String to download an image from the internet and then uses the downloaded image for an ImageView located in the UI.

URL url = new URL(url_path);BitmapFactory.decodeStream(url.openStream());

Page 42: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

AsyncTask LifeCycle

• When an AsyncTask is executed, it goes through 4 steps:1. onPreExecute()2. doInBackground(Params…)3. onProgressUpdate(Progress…)4. onPostExecute(Result…)

Page 43: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

onPreExecute()

• Invoked on the UI Thread immediately after execute() is called.

• Use this method to setup the task, show a progress bar in the user interface, etc.

Page 44: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

doInBackground(Params…)

• Performs background computation.

• Use this to publishProgress(Progress…) to publish one or more units of progress to the UI Thread.

Page 45: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

onProgressUpdated(Progress…)

• Invoked on the UI thread after a call to publishProgress().

• Used to display any form of progress in the User Interface while background computation is taking place.

• Use this to animate a progress bar or show logs in a text field.

Page 46: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

onPostExecute(Result)

• Invoked on the UI thread after doInBackground() completes.

Page 47: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Use cases for AsyncTasks

• Create an AsyncTask to load an image contained in a list item view.

• Create an AsyncTask to query the Database

• Grabbing JSON from the web

Page 48: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP Request

1. Ask for permission in AndroidManifest!

2. Make use of HttpClient

3. GET, PUT, DELETE, and POST methods supported

4. Use HttpResponse for server response

Page 49: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP GetHttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet("http://google.com");try {

HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();if (null != entity) {

String result = EntityUtils.toString(entity);Log.d("CRR", result);

}

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

Page 50: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP GetHttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet("http://google.com");try {

HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();if (null != entity) {

String result = EntityUtils.toString(entity);Log.d("CRR", result);

}

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

HttpClient object is required for all HTTP Methods.

Page 51: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP GetHttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet("http://google.com");try {

HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();if (null != entity) {

String result = EntityUtils.toString(entity);Log.d("CRR", result);

}

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

Pass the url of the resource you want to GET into the HttpGet Object constructor.

Page 52: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP GetHttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet("http://google.com");try {

HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();if (null != entity) {

String result = EntityUtils.toString(entity);Log.d("CRR", result);

}

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

Execute the HTTP request and receive a response.

Page 53: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP GetHttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet("http://google.com");try {

HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();if (null != entity) {

String result = EntityUtils.toString(entity);Log.d("CRR", result);

}

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

Returns the message entity of the response.

Page 54: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP GetHttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet("http://google.com");try {

HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();if (null != entity) {

String result = EntityUtils.toString(entity);Log.d("CRR", result);

}

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

If the Entity isn’t null then the response is valid. Get the String representation of the response.

Page 55: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP GetHttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet("http://google.com");try {

HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();if (null != entity) {

String result = EntityUtils.toString(entity);Log.d("CRR", result);

}

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

Do whatever you want with the response.

Page 56: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Another way to HTTP Gettry {

URL url = new URL("http://lyle.smu.edu/~craley/3345");HttpURLConnection con = (HttpURLConnection) url .openConnection();reader = new BufferedReader(new InputStreamReader(con.getInputStream()));StringBuilder sb = new StringBuilder();String line = reader.readLine();while (line != null) { sb.append(line + "\n"); line = reader.readLine();}

} catch (Exception e) { e.printStackTrace();}

Page 57: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP Put

• Similar to HTTP Get

• Need to create a list of name value pairs for parameters to send to server.

Page 58: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP PutHttpClient client = new DefaultHttpClient();HttpPost post = new HttpPost(“http://www.google.com”);List<NameValuePair> request = new ArrayList<NameValuePair>();request.add(new BasicNameValuePair("fname", "Chris"));request.add(new BasicNameValuePair("lname", "Raley"));request.add(new BasicNameValuePair("id", "123456789"));Person person = new Person("Chris Raley", 17, false, new String[] {"Ice Cream Salesman" });request.add(new BasicNameValuePair("json", person.toJSONString()));try {

post.setEntity(new UrlEncodedFormEntity(request));HttpResponse response = client.execute(post);HttpEntity entity = response.getEntity();if (null != entity) {

String text = EntityUtils.toString(entity);Log.d("CRR", text);

}

} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

HttpClient object is required for all HTTP Methods. Same as GET example.

Page 59: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP PutHttpClient client = new DefaultHttpClient();HttpPost post = new HttpPost(“http://www.google.com”);List<NameValuePair> request = new ArrayList<NameValuePair>();request.add(new BasicNameValuePair("fname", "Chris"));request.add(new BasicNameValuePair("lname", "Raley"));request.add(new BasicNameValuePair("id", "123456789"));Person person = new Person("Chris Raley", 17, false, new String[] {"Ice Cream Salesman" });request.add(new BasicNameValuePair("json", person.toJSONString()));try {

post.setEntity(new UrlEncodedFormEntity(request));HttpResponse response = client.execute(post);HttpEntity entity = response.getEntity();if (null != entity) {

String text = EntityUtils.toString(entity);Log.d("CRR", text);

}

} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

Create a HTTP Post and pass in the resource we’re posting to.

Page 60: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP PutHttpClient client = new DefaultHttpClient();HttpPost post = new HttpPost(“http://www.google.com”);List<NameValuePair> request = new ArrayList<NameValuePair>();request.add(new BasicNameValuePair("fname", "Chris"));request.add(new BasicNameValuePair("lname", "Raley"));request.add(new BasicNameValuePair("id", "123456789"));Person person = new Person("Chris Raley", 17, false, new String[] {"Ice Cream Salesman" });request.add(new BasicNameValuePair("json", person.toJSONString()));try {

post.setEntity(new UrlEncodedFormEntity(request));HttpResponse response = client.execute(post);HttpEntity entity = response.getEntity();if (null != entity) {

String text = EntityUtils.toString(entity);Log.d("CRR", text);

}

} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

Create a List of NameValuePair objects to hold each parameter we’re sending as a part of our POST request.

Page 61: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP PutHttpClient client = new DefaultHttpClient();HttpPost post = new HttpPost(“http://www.google.com”);List<NameValuePair> request = new ArrayList<NameValuePair>();request.add(new BasicNameValuePair("fname", "Chris"));request.add(new BasicNameValuePair("lname", "Raley"));request.add(new BasicNameValuePair("id", "123456789"));Person person = new Person("Chris Raley", 17, false, new String[] {"Ice Cream Salesman" });request.add(new BasicNameValuePair("json", person.toJSONString()));try {

post.setEntity(new UrlEncodedFormEntity(request));HttpResponse response = client.execute(post);HttpEntity entity = response.getEntity();if (null != entity) {

String text = EntityUtils.toString(entity);Log.d("CRR", text);

}

} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

Creating a BasicNameValuePair object to hold a name/value pair. Insert the BasicNameValuePair object into the NameValuePair list.

Page 62: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP PutHttpClient client = new DefaultHttpClient();HttpPost post = new HttpPost(“http://www.google.com”);List<NameValuePair> request = new ArrayList<NameValuePair>();request.add(new BasicNameValuePair("fname", "Chris"));request.add(new BasicNameValuePair("lname", "Raley"));request.add(new BasicNameValuePair("id", "123456789"));Person person = new Person("Chris Raley", 17, false, new String[] {"Ice Cream Salesman" });request.add(new BasicNameValuePair("json", person.toJSONString()));try {

post.setEntity(new UrlEncodedFormEntity(request));HttpResponse response = client.execute(post);HttpEntity entity = response.getEntity();if (null != entity) {

String text = EntityUtils.toString(entity);Log.d("CRR", text);

}

} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

UrlEncodedFormEntity is an entity composed of a list of url-encoded pairs. Useful for POST requests.

Page 63: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

HTTP PutHttpClient client = new DefaultHttpClient();HttpPost post = new HttpPost(“http://www.google.com”);List<NameValuePair> request = new ArrayList<NameValuePair>();request.add(new BasicNameValuePair("fname", "Chris"));request.add(new BasicNameValuePair("lname", "Raley"));request.add(new BasicNameValuePair("id", "123456789"));Person person = new Person("Chris Raley", 17, false, new String[] {"Ice Cream Salesman" });request.add(new BasicNameValuePair("json", person.toJSONString()));try {

post.setEntity(new UrlEncodedFormEntity(request));HttpResponse response = client.execute(post);HttpEntity entity = response.getEntity();if (null != entity) {

String text = EntityUtils.toString(entity);Log.d("CRR", text);

}

} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();

} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();

}

Same as GET request.

Page 64: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

XML and JSON Parsing

• Not as easy as Javascript.

• Use the following for help:1. JSON in Android Tutorial2. Android JSON Parsing Tutorial3. Android XML Parsing Tutorial4. GSON – Java library to convert JSON to Java

Objects and vice versa.

Page 65: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

CSE 3345 65

JSON Quick facts

• JSON – javascript object notation

• JSON is a collection of name value pairs

• Is a data-exchange format.

• Closely resembles Javascript syntax.

• Can parse JSON into a JS object.

Page 66: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

CSE 3345 66

Hello World JSON Example

{ “fname" : “bruce" }

1. All JSON data starts and ends with a curly brace2. The curly brace is what encapsulates the data into an Object.3. After all, JSON stands for Javascript Object Notation.

Object

Page 67: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

CSE 3345 67

Hello World JSON Example

{ “fname" : “bruce" }

name value

pair

Page 68: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

CSE 3345 68

Hello World JSON Example

{ “fname" : “bruce" }

name value

pair

The name portion of the pair must ALWAYS be a String.

Page 69: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

CSE 3345 69

Hello World JSON Example

{ “fname" : “bruce" }

valuename

pair

The value portion of the pair can be several different types.

Page 70: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

CSE 3345 70

Value types

1. numbers2. booleans3. Strings4. null5. arrays (ordered sequences of values)

6. objects (string-value mappings) composed of these values (or of other arrays and objects).

Page 71: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

CSE 3345 71

JSON Example

{ "age": 21, "name": "Sandra Dee", "alive": false}

• It is necessary to separate each pair with a comma. Your JSON will be invalid if you don’t.

Page 72: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

CSE 3345 72

JSON Array Example{ "scores": [ 100, 89, 99, 75]}

• An array is an ordered collection of values.

• An array begins with a [ (left bracket) and ends with ] (right bracket).

• Values are separated by a , (comma).

Page 73: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

CSE 3345 73

Object in JSON

• Just like typical Object-Oriented Programming, you can have objects inside of objects

{ “pizza” : {

“name” : “The Heart Attack”, “id” : 20121,“toppings” : [ “Pepperoni”, “Cheese”, “Chili” ],“price” : 19.99

}}

Page 74: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

CSE 3345 74

JSON Example

{ "type": "document", "students": [ "tom", "sally", "joe" ], "class room": 112, "teach": "Hank McCoy“, “fulltime” : false}

Page 75: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

CSE 3345 75

Dissect the JSON Data{ "type": "document", "students": [ { "name": "tom", "age": 18 }, { "name": "sally", "age": 18 }, { "name": "joe", "age": 17 } ], "class room": 112, "teacher": "Hank McCoy", "fulltime": false}

Page 76: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

JSONObject and JSONArray

• Use these two classes to get and create JSON.

• Think of each class as a HashMap. They hold a collection of name value pairs.

Page 77: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

JSONObject

• A modifiable set of name/value mappings. Names are unique, non-null strings.

• Values may be any mix of JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL.

• Values may not be null, NaNs, infinities, or of any type not listed here.

Page 78: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

How to get with JSONObjectString json = "{ "person": { "name": "Ted Mosby", "age": 32, "profession": [ "Architect", "Professor" ], "married": false } }";

Page 79: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Convert JSON string to JSONObjectString json = "{ "person": { "name": "Ted Mosby", "age": 32, "profession": [ "Architect", "Professor" ], "married": false } }";

JSONObject jsonObj = new JSONObject(json);

Create JSONObject so we can accessThe name/value pairs.

Page 80: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Convert JSON string to JSONObjectString json = "{ "person": { "name": "Ted Mosby", "age": 32, "profession": [ "Architect", "Professor" ], "married": false } }";

JSONObject jsonObj = new JSONObject(json); JSONObject jsonPerson = jsonObj.getJSONObject(“person”);person.name = jsonPerson.getString(“name”);person.age = jsonPerson.getInt(“age”);person.isMarried = jsonPerson.getBoolean(“married”);

Extract json values using the corresponding name pair

Page 81: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

JSONArray

• A dense indexed sequence of values.

• Values may be any mix of JSONObjects, other JSONArrays, Strings, Booleans, Integers, Longs, Doubles, null or NULL.

• Values may not be NaNs, infinities, or of any type not listed here.

• JSONArray has the same type coercion behavior and optional/mandatory accessors as JSONObject.

Page 82: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

String json = "{ "person": { "name": "Ted Mosby", "age": 32, "profession": [ "Architect", "Professor" ], "married": false } }";

JSONObject jsonObj = new JSONObject(json); JSONObject jsonPerson = jsonObj.getJSONObject(“person”);person.name = jsonPerson.getString(“name”);person.age = jsonPerson.getInt(“age”);person.isMarried = jsonPerson.getBoolean(“married”);JSONArray jsonProfessions = jsonPerson.getJSONArray(“profession”);

Since we have an array in our json, we need to create a JSONArray object to access the values inside the array.

Page 83: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

String json = "{ "person": { "name": "Ted Mosby", "age": 32, "profession": [ "Architect", "Professor" ], "married": false } }";

JSONObject jsonObj = new JSONObject(json); JSONObject jsonPerson = jsonObj.getJSONObject(“person”);person.name = jsonPerson.getString(“name”);person.age = jsonPerson.getInt(“age”);person.isMarried = jsonPerson.getBoolean(“married”);JSONArray jsonProfessions = jsonPerson.getJSONArray(“profession”);for (int i = 0; i < jsonProfessions.length(); i++) {

person.profession.add(jsonProfessions.getString(i));}

Iterate through the JSONArray like a normal array except you have to explicitly pick a type to get from the JSONArray.

Page 84: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Creating JSON in Android

• JSONObject and JSONArray both have put() methods that allow you to add data into each object.

• Just create a new JSONObject or JSONArray and start putting stuff in it.

Page 85: HTTP and Threads. Getting Data from the Web Believe it or not, Android apps are able to pull data from the web. Developers can download bitmaps and text

Additional Data Loading Techniques

• Android also provides Loaders for asynchronous data loading.

• They take a little more work, but the results are worth it.

• See documentation for details.