Presentation is loading. Please wait.

Presentation is loading. Please wait.

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.

Similar presentations


Presentation on theme: "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."— Presentation transcript:

1 HTTP and Threads

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

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

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

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

6 Step 1: Ask for Permission <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" /> <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" >

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

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

9 Step 2: Make a connection Bitmap 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);

10 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 //Bitmap img = BitmapFactory.decodeStream(url.openStream());

11 Step 3: Use the data Bitmap 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);

12 Full Code for Making a Connection Bitmap 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);

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

14 Decode Bitmap from stream http://stackoverflow.com/a/5776903/122223 2 http://stackoverflow.com/a/5776903/122223 2

15 Your Turn! Create an Android application that uses a URL to create a Bitmap and place that Bitmap as the source of an ImageView.

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

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

18 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

19 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

20 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

21 UI Thread Execution Handle Touch Events Measure Layout Draw UI Thread

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

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

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

25 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!

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

27 2 ways to thread and synchronize Handler AsyncTask

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

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

30 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

31 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

32 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

33 AsyncTask Example public void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png"); } 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); }

34 1. Subclass AsyncTask public void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png"); } 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

35 2. Specify code for worker thread public void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png"); } 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

36 3. Specify code to update UI public void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png"); } 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

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

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

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

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

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

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

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

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

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

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

47 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

48 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

49 HTTP Get HttpClient 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 block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }

50 HTTP Get HttpClient 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 block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } HttpClient object is required for all HTTP Methods.

51 HTTP Get HttpClient 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 block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Pass the url of the resource you want to GET into the HttpGet Object constructor.

52 HTTP Get HttpClient 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 block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Execute the HTTP request and receive a response.

53 HTTP Get HttpClient 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 block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Returns the message entity of the response.

54 HTTP Get HttpClient 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 block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } If the Entity isn’t null then the response is valid. Get the String representation of the response.

55 HTTP Get HttpClient 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 block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Do whatever you want with the response.

56 Another way to HTTP Get try { 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(); }

57 HTTP Put Similar to HTTP Get Need to create a list of name value pairs for parameters to send to server.

58 HTTP Put HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(“http://www.google.com”); List request = new ArrayList (); 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 block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } HttpClient object is required for all HTTP Methods. Same as GET example.

59 HTTP Put HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(“http://www.google.com”); List request = new ArrayList (); 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 block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Create a HTTP Post and pass in the resource we’re posting to.

60 HTTP Put HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(“http://www.google.com”); List request = new ArrayList (); 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 block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Create a List of NameValuePair objects to hold each parameter we’re sending as a part of our POST request.

61 HTTP Put HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(“http://www.google.com”); List request = new ArrayList (); 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 block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Creating a BasicNameValuePair object to hold a name/value pair. Insert the BasicNameValuePair object into the NameValuePair list.

62 HTTP Put HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(“http://www.google.com”); List request = new ArrayList (); 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 block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } UrlEncodedFormEntity is an entity composed of a list of url- encoded pairs. Useful for POST requests.

63 HTTP Put HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(“http://www.google.com”); List request = new ArrayList (); 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 block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Same as GET request.

64 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

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

66 Hello World JSON Example { “fname" : “bruce" } CSE 334566 1.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

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

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

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

70 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 334570

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

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

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

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

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

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

77 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

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

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

80 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

81 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

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

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

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

85 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


Download ppt "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."

Similar presentations


Ads by Google