HTTP and Threads. Download some code I’ve created an Android Project which gives examples of everything covered in this lecture. Download code here.here.

Slides:



Advertisements
Similar presentations
Chapter 6 Server-side Programming: Java Servlets
Advertisements

Application Fundamentals Android Development. Announcements Posting in D2L Tutorials.
USING ANDROID WITH THE INTERNET. Slide 2 Network Prerequisites The following must be included so as to allow the device to connect to the network The.
Threads, AsyncTasks & Handlers.  Android implements Java threads & concurrency classes  Conceptual view  Parallel computations running in a process.
Road Map Introduction to object oriented programming. Classes
1 Frameworks. 2 Framework Set of cooperating classes/interfaces –Structure essential mechanisms of a problem domain –Programmer can extend framework classes,
Exceptions in Java Fawzi Emad Chau-Wen Tseng Department of Computer Science University of Maryland, College Park.
Cosc 4730 Brief return Sockets And HttpClient And AsyncTask.
1 Fall 2008ACS-1903 for Loop Reading files String conversions Random class.
Web Proxy Server. Proxy Server Introduction Returns status and error messages. Handles http CGI requests. –For more information about CGI please refer.
Android Application Development Tutorial. Topics Lecture 5 Overview Overview of Networking Programming Tutorial 2: Downloading from the Internet.
Web server and web browser It’s a take and give policy in between client and server through HTTP(Hyper Text Transport Protocol) Server takes a request.
Chien-Chung Shen Manifest and Activity Chien-Chung Shen
HTTP and Threads. Download some code I’ve created an Android Project which gives examples of everything covered in this lecture. Download code here.here.
Networking Nasrullah. Input stream Most clients will use input streams that read data from the file system (FileInputStream), the network (getInputStream()/getInputStream()),
FALL 2005CSI 4118 – UNIVERSITY OF OTTAWA1 Part 4 Web technologies: HTTP, CGI, PHP,Java applets)
BUILDING A FACEBOOK APP. STEP 1 Create a Developers License. Make sure to take note/record the app id/key.
JavaScript & jQuery the missing manual Chapter 11
Simple Web Services. Internet Basics The Internet is based on a communication protocol named TCP (Transmission Control Protocol) TCP allows programs running.
CS378 - Mobile Computing Web - WebView and Web Services.
CSCI 6962: Server-side Design and Programming JDBC Database Programming.
Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved Concurrency in Android with.
Simple Web Services. Internet Basics The Internet is based on a communication protocol named TCP (Transmission Control Protocol) TCP allows programs running.
Cosc 5/4730 Introduction: Threads, Android Activities, and MVC.
Networking: Part 2 (Accessing the Internet). The UI Thread When an application is launched, the system creates a “main” UI thread responsible for handling.
Mobile Application Development using Android Lecture 2.
COMP 321 Week 7. Overview HTML and HTTP Basics Dynamic Web Content ServletsMVC Tomcat in Eclipse Demonstration Lab 7-1 Introduction.
1 Announcements Homework #2 due Feb 7 at 1:30pm Submit the entire Eclipse project in Blackboard Please fill out the when2meets when your Project Manager.
9 Chapter Nine Compiled Web Server Programs. 9 Chapter Objectives Learn about Common Gateway Interface (CGI) Create CGI programs that generate dynamic.
Networking Android Club Networking AsyncTask HttpUrlConnection JSON Parser.
CS378 - Mobile Computing Web - WebView and Web Services.
11 Web Services. 22 Objectives You will be able to Say what a web service is. Write and deploy a simple web service. Test a simple web service. Write.
JAVA SERVER PAGES. 2 SERVLETS The purpose of a servlet is to create a Web page in response to a client request Servlets are written in Java, with a little.
Basic Java Syntax CSE301 University of Sunderland Harry R Erwin, PhD.
Chapter 3 Servlet Basics. 1.Recall the Servlet Role 2.Basic Servlet Structure 3.A simple servlet that generates plain text 4.A servlet that generates.
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.
Serialization. Serialization is the process of converting an object into an intermediate format that can be stored (e.g. in a file or transmitted across.
Chapter 6 Server-side Programming: Java Servlets
Introduction to Socket Programming in Android Jules White Bradley Dept. of Electrical and Computer Engineering Virginia Tech
MAKANI ANDROID APPLICATION Prepared by: Asma’ Hamayel Alaa Shaheen.
Dynamic Architectures (Component Reconfiguration) with Fractal.
CSE 451: Operating Systems Winter 2015 Module 22 Remote Procedure Call (RPC) Mark Zbikowski Allen Center 476 © 2013 Gribble, Lazowska,
CS378 - Mobile Computing Responsiveness. An App Idea From Nifty Assignments Draw a picture use randomness Pick an equation at random Operators in the.
Android networking 1. Network programming with Android If your Android is connected to a WIFI, you can connect to servers using the usual Java API, like.
Chapter 6 Introduction to Defining Classes. Objectives: Design and implement a simple class from user requirements. Organize a program in terms of a view.
Server - Client Communication Getting data from server.
Fall 2002CS 150: Intro. to Computing1 Streams and File I/O (That is, Input/Output) OR How you read data from files and write data to files.
Android Threads. Threads Android will show an “ANR” error if a View does not return from handling an event within 5 seconds Or, if some code running in.
1 Java Servlets l Servlets : programs that run within the context of a server, analogous to applets that run within the context of a browser. l Used to.
HW#9 Clues CSCI 571 Fall, HW#9 Prototype
Project Scenario for OpX. High-level Overview In the Test GUI Controller, opXController, for the opX command there is conceptually a call to an appropriate.
RESTful Web Services What is RESTful?
CIS Intro to JAVA Lecture Notes Set July-05 GUI Programming –TextField Action Listeners, JEditorPane action listeners, HTML in a JEditorPane,
Recap of Part 1 Terminology Windows FormsAndroidMVP FormActivityView? ControlViewView? ?ServiceModel? Activities Views / ViewGroups Intents Services.
AJAX. Ajax  $.get  $.post  $.getJSON  $.ajax  json and xml  Looping over data results, success and error callbacks.
Adding network connections. Connecting to the Network To perform the network operations, your application manifest must include the following permissions:
Lecture 6: Process and Threads Topics: Process, Threads, Worker Thread, Async Task Date: Mar 1, 2016.
Simple Web Services. Internet Basics The Internet is based on a communication protocol named TCP (Transmission Control Protocol) TCP allows programs running.
Introduction to Exceptions in Java CS201, SW Development Methods.
USING ANDROID WITH THE INTERNET. Slide 2 Lecture Summary Getting network permissions Working with the HTTP protocol Sending HTTP requests Getting results.
Messaging and Networking. Objectives Send SMS messages using the Messaging app Send SMS messages programmatically from within your app Receive and consume.
Plan for today Open-Closed and Quizmaster
Indexer AKEEL AHMED.
CSE 154 Lecture 22: AJAX.
CS371m - Mobile Computing Responsiveness.
Android Topics Asynchronous Callsbacks
Android Developer Fundamentals V2
Threads, Handlers, and AsyncTasks
Lecture 6: Process, Thread, Task
Android Threads Dimitar Ivanov Mobile Applications with Android
Presentation transcript:

HTTP and Threads

Download some code I’ve created an Android Project which gives examples of everything covered in this lecture. Download code here.here

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.

How to use HTTP with Android 1.Ask for permission 2.Make a connection 3.Use the data

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.

Step 1: Ask for Permission Open your project’s AndroidManifeset.xml Add the following xml:

Step 1: Ask for Permission <manifest xmlns:android=" package="com.example.androidhttp" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" > <activity android:name="com.example.androidhttp.MainActivity" >

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.

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.

Step 2: Make a connection public Bitmap loadImageFromNetwork(String imgUrl) { Bitmap img = null; URL url; try { //A uniform resource locator aka the place where the data is //located url = new URL(imgUrl); //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(); } return img; }

Using a URL to create a Bitmap url = new URL(imgUrl); //Opens an HTTPUrlConnection and downloads the input stream into a //Bitmap img = BitmapFactory.decodeStream(url.openStream());

Step 3: Use the data public Bitmap loadImageFromNetwork(String imgUrl) { Bitmap img = null; URL url; try { //A uniform resource locator aka the place where the data is //located url = new URL(imgUrl); //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(); } return img; }

Full Code for Making a Connection public Bitmap loadImageFromNetwork(String imgUrl) { Bitmap img = null; URL url; try { //A uniform resource locator aka the place where the data is //located url = new URL(imgUrl); //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(); } return img; }

Convert Bitmap to Drawable Bitmap img = loadImageFromNetwork(" image/img.png"); //Convert bitmap to drawable Drawable d = new BitmapDrawable(getResources(), img);

Decode Bitmap from stream

Your Turn! Create a method that uses a URL to create a Bitmap and place that Bitmap as the background of the CanvasView in your PaintApp. //Convert bitmap to drawable Drawable d = new BitmapDrawable(getResources(), img); //Set drawable to a View’s background (deprecated) mCanvas.setBackgroundDrawable(d); //Set drawable to a View’s background. Use with newer API versions mCanvas.setBackground(d);

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

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.

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

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

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

UI Thread Execution Handle Touch Events Measure Layout Draw UI Thread

UI Thread Execution with HTTP Request Handle Touch Events Measure Layout Draw UI Thread Internet

ANR (Activity Not Responding) Error Happens when your UI Thread is paused/blocked too long.

Operations to avoid on UI Thread HTTP Request Database Querying File download/upload Image/Video Processing

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!

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.

2 ways to thread and synchronize Handler AsyncTask

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)

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.

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

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

UI Thread Execution with AsyncTask Handle Touch Events Measure Layout Draw UI Thread Spawn Thread Do Time Consuming Operation Synchronize with UI Thread with results

AsyncTask Example public void onClick(View v) { new DownloadImageTask().execute(" } private class DownloadImageTask extends AsyncTask { /** 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. Subclass AsyncTask public void onClick(View v) { new DownloadImageTask().execute(" } private class DownloadImageTask extends AsyncTask { /** 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

2. Specify code for worker thread public void onClick(View v) { new DownloadImageTask().execute(" } private class DownloadImageTask extends AsyncTask { /** 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

3. Specify code to update UI public void onClick(View v) { new DownloadImageTask().execute(" } private class DownloadImageTask extends AsyncTask { /** 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

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()

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.

AsyncTask Parameters extends AsyncTask 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.

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 {... }

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());

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

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.

doInBackground(Params…) Performs background computation. Use this to publishProgress(Progress…) to publish one or more units of progress to the UI Thread.

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.

onPostExecute(Result) Invoked on the UI thread after doInBackground() completes.

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

HTTP Request 1.Ask for permission in AndroidManifest! 2.Make use of HttpURLConnectionHttpURLConnection 3.GET, PUT, DELETE, and POST methods supported 4.Use HttpResponse for server response

HTTP Get URL requestURL = new URL(“ connection = (HttpURLConnection) requestURL.openConnection(); connection.setReadTimeout( ); //This is configurable to your liking connection.setConnectTimeout( ); //This is configurable to your liking final int statusCode = connection.getResponseCode(); if (statusCode == HttpURLConnection.HTTP_UNAUTHORIZED) { Log.d("CRR", "You're not authorized to access the requested resource. So bail..."); } else if (statusCode != HttpURLConnection.HTTP_OK) { Log.d("CRR", "The request failed with status code: " + statusCode + ". Use the status code to debug this problem."); } else { Log.d("CRR", “The request was successful!!!“); //Add code here to process the request } 1.Create a URL which points to the resource you want to get. 2.Use the URL and open a connection 3.Setup the connection’s read and connection timeout

HTTP Get URL requestURL = new URL(“ connection = (HttpURLConnection) requestURL.openConnection(); connection.setReadTimeout( ); //This is configurable to your liking connection.setConnectTimeout( ); //This is configurable to your liking final int statusCode = connection.getResponseCode(); if (statusCode == HttpURLConnection.HTTP_UNAUTHORIZED) { Log.d("CRR", "You're not authorized to access the requested resource. So bail..."); } else if (statusCode != HttpURLConnection.HTTP_OK) { Log.d("CRR", "The request failed with status code: " + statusCode + ". Use the status code to debug this problem."); } else { Log.d("CRR", “The request was successful!!!“); //Add code here to process the request } 1.getResponseCode() returns the response code given by the server: A.HTTP_OK  200 : Request was successful B.HTTP_NOT_FOUND  404 : The resource was not found C.Etc.

HTTP Get URL requestURL = new URL(“ connection = (HttpURLConnection) requestURL.openConnection(); connection.setReadTimeout( ); //This is configurable to your liking connection.setConnectTimeout( ); //This is configurable to your liking final int statusCode = connection.getResponseCode(); if (statusCode == HttpURLConnection.HTTP_UNAUTHORIZED) { Log.d("CRR", "You're not authorized to access the requested resource. So bail..."); } else if (statusCode != HttpURLConnection.HTTP_OK) { Log.d("CRR", "The request failed with status code: " + statusCode + ". Use the status code to debug this problem."); } else { Log.d("CRR", “The request was successful!!!“); //Add code here to process the request } 1.Use the statusCode to figure out how to handle the request. HTTP_OK or 200 means it was successful. If we have a successful request we can use the connection to fetch the data we’re interested in.

Extracting the data from the HTTP Request There are 2 approaches – The traditional approach – A new approach that I just found and haven’t tested thoroughly

Traditional Approach //This connection variable comes from the previous HTTP Get code. InputStream stream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); StringBuilder sb = new StringBuilder(); String line = reader.readLine(); while (line != null) { sb.append(line + "\n"); line = reader.readLine(); } String result = sb.toString(); //This holds the response data we want

New “not well tested” Approach //This connection variable comes from the previous HTTP Get code. InputStream stream = connection.getInputStream(); Scanner scanner = new Scanner(stream); //The variable result holds the response data we want final String result = scanner.useDelimiter("\\A").next(); scanner.close();

HTTP Post Similar to HTTP Get We just need to do a little more configuration

URL url = new URL(" HttpURLConnection connection; connection = (HttpURLConnection) url.openConnection(); connection.setReadTimeout(10000); connection.setConnectTimeout(15000); //Need to specify we’re sending a POST request. HttpURLConnection is set a GET by default. connection.setRequestMethod("POST"); //We're sending JSON so specify that as the content-type for the HTTP message connection.setRequestProperty("Content-Type", "application/json"); //If the server supports JSON, ask for it to return a response in JSON format connection.setRequestProperty("Accept", "application/json"); //CREATE A JSON OBJECT TO SEND: This is code that generate JSON JSONObject person = getJSONPerson(); //END CREATING OF JSON //SEND THE JSON final String json = person.toString(); connection.getOutputStream().write(json.getBytes()); connection.getOutputStream().flush(); connection.connect(); //END SEND final int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { Log.d("CRR", "The request failed with status code: " + statusCode + ". Use the status code to debug this problem."); } else { InputStream in = new BufferedInputStream(connection.getInputStream()); String result = getResponseText(in); Log.d("CRR", result); } Sending JSON with HTTP Post

URL url = new URL(" HttpURLConnection connection; connection = (HttpURLConnection) url.openConnection(); connection.setReadTimeout(10000); connection.setConnectTimeout(15000); //Need to specify we’re sending a POST request. HttpURLConnection is set a GET by default. connection.setRequestMethod("POST"); //We're sending JSON so specify that as the content-type for the HTTP message connection.setRequestProperty("Content-Type", "application/json"); //If the server supports JSON, ask for it to return a response in JSON format connection.setRequestProperty("Accept", "application/json"); //CREATE A JSON OBJECT TO SEND: This is code that generate JSON JSONObject person = getJSONPerson(); //END CREATING OF JSON //SEND THE JSON final String json = person.toString(); connection.getOutputStream().write(json.getBytes()); connection.getOutputStream().flush(); connection.connect(); //END SEND final int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { Log.d("CRR", "The request failed with status code: " + statusCode + ". Use the status code to debug this problem."); } else { InputStream in = new BufferedInputStream(connection.getInputStream()); String result = getResponseText(in); Log.d("CRR", result); } Sending JSON with HTTP Post Exactly the same configuration as the GET request.

URL url = new URL(" HttpURLConnection connection; connection = (HttpURLConnection) url.openConnection(); connection.setReadTimeout(10000); connection.setConnectTimeout(15000); //Need to specify we’re sending a POST request. HttpURLConnection is set a GET by default. connection.setRequestMethod("POST"); //We're sending JSON so specify that as the content-type for the HTTP message connection.setRequestProperty("Content-Type", "application/json"); //If the server supports JSON, ask for it to return a response in JSON format connection.setRequestProperty("Accept", "application/json"); //CREATE A JSON OBJECT TO SEND: This is code that generate JSON JSONObject person = getJSONPerson(); //END CREATING OF JSON //SEND THE JSON final String json = person.toString(); connection.getOutputStream().write(json.getBytes()); connection.getOutputStream().flush(); connection.connect(); //END SEND final int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { Log.d("CRR", "The request failed with status code: " + statusCode + ". Use the status code to debug this problem."); } else { InputStream in = new BufferedInputStream(connection.getInputStream()); String result = getResponseText(in); Log.d("CRR", result); } Sending JSON with HTTP Post We need to specify it’s a POST request.

URL url = new URL(" HttpURLConnection connection; connection = (HttpURLConnection) url.openConnection(); connection.setReadTimeout(10000); connection.setConnectTimeout(15000); //Need to specify we’re sending a POST request. HttpURLConnection is set a GET by default. connection.setRequestMethod("POST"); //We're sending JSON so specify that as the content-type for the HTTP message connection.setRequestProperty("Content-Type", "application/json"); //If the server supports JSON, ask for it to return a response in JSON format connection.setRequestProperty("Accept", "application/json"); //CREATE A JSON OBJECT TO SEND: This is code that generate JSON JSONObject person = getJSONPerson(); //END CREATING OF JSON //SEND THE JSON final String json = person.toString(); connection.getOutputStream().write(json.getBytes()); connection.getOutputStream().flush(); connection.connect(); //END SEND final int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { Log.d("CRR", "The request failed with status code: " + statusCode + ". Use the status code to debug this problem."); } else { InputStream in = new BufferedInputStream(connection.getInputStream()); String result = getResponseText(in); Log.d("CRR", result); } Sending JSON with HTTP Post Using setRequestProperty() we can specifiy additional HTTP Headers in our request.

URL url = new URL(" HttpURLConnection connection; connection = (HttpURLConnection) url.openConnection(); connection.setReadTimeout(10000); connection.setConnectTimeout(15000); //Need to specify we’re sending a POST request. HttpURLConnection is set a GET by default. connection.setRequestMethod("POST"); //We're sending JSON so specify that as the content-type for the HTTP message connection.setRequestProperty("Content-Type", "application/json"); //If the server supports JSON, ask for it to return a response in JSON format connection.setRequestProperty("Accept", "application/json"); //CREATE A JSON OBJECT TO SEND: This is code that generate JSON JSONObject person = getJSONPerson(); //END CREATING OF JSON //SEND THE JSON final String json = person.toString(); connection.getOutputStream().write(json.getBytes()); connection.getOutputStream().flush(); connection.connect(); //END SEND final int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { Log.d("CRR", "The request failed with status code: " + statusCode + ". Use the status code to debug this problem."); } else { InputStream in = new BufferedInputStream(connection.getInputStream()); String result = getResponseText(in); Log.d("CRR", result); } Sending JSON with HTTP Post We’re sending JSON, so we need some JSON. Here I’m getting a JSONObject which contains a bunch of JSON data.

URL url = new URL(" HttpURLConnection connection; connection = (HttpURLConnection) url.openConnection(); connection.setReadTimeout(10000); connection.setConnectTimeout(15000); //Need to specify we’re sending a POST request. HttpURLConnection is set a GET by default. connection.setRequestMethod("POST"); //We're sending JSON so specify that as the content-type for the HTTP message connection.setRequestProperty("Content-Type", "application/json"); //If the server supports JSON, ask for it to return a response in JSON format connection.setRequestProperty("Accept", "application/json"); //CREATE A JSON OBJECT TO SEND: This is code that generate JSON JSONObject person = getJSONPerson(); //END CREATING OF JSON //SEND THE JSON final String json = person.toString(); connection.getOutputStream().write(json.getBytes()); connection.getOutputStream().flush(); connection.connect(); //END SEND final int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { Log.d("CRR", "The request failed with status code: " + statusCode + ". Use the status code to debug this problem."); } else { InputStream in = new BufferedInputStream(connection.getInputStream()); String result = getResponseText(in); Log.d("CRR", result); } Sending JSON with HTTP Post 1.Convert the JSON Object to a String 2.Convert the String to Bytes so we can write to a stream for the HTTP Request 3.Flush the stream. This means we’ve written everything and we done. 4.Connect to the server and send the data.

URL url = new URL(" HttpURLConnection connection; connection = (HttpURLConnection) url.openConnection(); connection.setReadTimeout(10000); connection.setConnectTimeout(15000); //Need to specify we’re sending a POST request. HttpURLConnection is set a GET by default. connection.setRequestMethod("POST"); //We're sending JSON so specify that as the content-type for the HTTP message connection.setRequestProperty("Content-Type", "application/json"); //If the server supports JSON, ask for it to return a response in JSON format connection.setRequestProperty("Accept", "application/json"); //CREATE A JSON OBJECT TO SEND: This is code that generate JSON JSONObject person = getJSONPerson(); //END CREATING OF JSON //SEND THE JSON final String json = person.toString(); connection.getOutputStream().write(json.getBytes()); connection.getOutputStream().flush(); connection.connect(); //END SEND final int statusCode = connection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { Log.d("CRR", "The request failed with status code: " + statusCode + ". Use the status code to debug this problem."); } else { InputStream in = new BufferedInputStream(connection.getInputStream()); String result = getResponseText(in); Log.d("CRR", result); } Sending JSON with HTTP Post If we care about a response, handle it just like the GET request.

XML and JSON Parsing Not as easy as Javascript. Use the following for help: 1.JSON in Android TutorialJSON in Android Tutorial 2.Android JSON Parsing TutorialAndroid JSON Parsing Tutorial 3.Android XML Parsing TutorialAndroid XML Parsing Tutorial 4.GSON – Java library to convert JSON to Java Objects and vice versa.GSON

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. CSE

Hello World JSON Example { “fname" : “bruce" } CSE All JSON data starts and ends with a curly brace 2.The curly brace is what encapsulates the data into an Object. 3.After all, JSON stands for Javascript Object Notation. Object

Hello World JSON Example { “fname" : “bruce" } CSE namevalue pair

Hello World JSON Example { “fname" : “bruce" } CSE namevalue pair The name portion of the pair must ALWAYS be a String.

Hello World JSON Example { “fname" : “bruce" } CSE valuename pair The value portion of the pair can be several different types.

Value types 1.numbers 2.booleans 3.Strings 4.null 5.arrays (ordered sequences of values) 6.objects (string-value mappings) composed of these values (or of other arrays and objects). CSE

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. CSE

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). CSE

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” : } CSE

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

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 } CSE

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.

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.JSONObjectsJSONArraysNULL Values may not be null, NaNs, infinities, or of any type not listed here.NaNsinfinities

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

Convert JSON string to JSONObject String json = "{ "person": { "name": "Ted Mosby", "age": 32, "profession": [ "Architect", "Professor" ], "married": false } }"; JSONObject jsonObj = new JSONObject(json); Create JSONObject so we can access The name/value pairs.

Convert JSON string to JSONObject 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”); Extract json values using the corresponding name pair

JSONArray A dense indexed sequence of values. Values may be any mix of JSONObjects, other JSONArrays, Strings, Booleans, Integers, Longs, Doubles, null or NULL.JSONObjectsJSONArraysNULL Values may not be NaNs, infinities, or of any type not listed here.NaNsinfinities JSONArray has the same type coercion behavior and optional/mandatory accessors as JSONObject.JSONObject

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.

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.

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.

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.documentation