User Tools

Site Tools


android_learning:headfirst_android_development_notes:chapter_12

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
android_learning:headfirst_android_development_notes:chapter_12 [2016/04/24 02:25] – [pp. 526+: Threads] mithatandroid_learning:headfirst_android_development_notes:chapter_12 [2016/04/24 04:08] (current) – [p. 513-514: Code block] mithat
Line 1: Line 1:
 ====== Chapter 12 ====== ====== Chapter 12 ======
  
-<WRAP center round info 60%> +This is just some text to get the section below to clear the Table of Contents. Otherwise the whole code block would appear very narrow. 
-Under development+ 
-</WRAP>+Kludgey for sure, but it gets the job done \\ 
 + \\  
 + \\  
 + \\  
 + \\ 
  
 ===== p. 493: Code block ===== ===== p. 493: Code block =====
Line 34: Line 38:
         try {         try {
             // Gain access to our app's database:             // Gain access to our app's database:
-            SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);+            SQLiteOpenHelper starbuzzDatabaseHelper = 
 +                new StarbuzzDatabaseHelper(this);
             SQLiteDatabase db = starbuzzDatabaseHelper.getReadableDatabase();             SQLiteDatabase db = starbuzzDatabaseHelper.getReadableDatabase();
  
Line 69: Line 74:
             db.close();             db.close();
         } catch (SQLiteException e) {         } catch (SQLiteException e) {
-            Toast toast = Toast.makeText(this, "Database unavailable", Toast.LENGTH_SHORT);+            Toast toast = Toast.makeText(this, "Database unavailable",  
 +                Toast.LENGTH_SHORT);
             toast.show();             toast.show();
         }         }
Line 106: Line 112:
     protected void onCreate(Bundle savedInstanceState) {     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);         super.onCreate(savedInstanceState);
-        ListView listDrinks = getListView(); // i.e., this.getListView(); get the ListView used by this ListActivity+        ListView listDrinks = getListView(); // i.e., this.getListView();  
 +                                             // get the ListView used by  
 +                                             // this ListActivity
  
         // Use a cursor via an adapter to populate listDrinks         // Use a cursor via an adapter to populate listDrinks
         try {         try {
             // Gain access to our app's database:             // Gain access to our app's database:
-            SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);+            SQLiteOpenHelper starbuzzDatabaseHelper =  
 +                new StarbuzzDatabaseHelper(this);
             db = starbuzzDatabaseHelper.getReadableDatabase();             db = starbuzzDatabaseHelper.getReadableDatabase();
  
Line 130: Line 139:
             listDrinks.setAdapter(listAdapter);             listDrinks.setAdapter(listAdapter);
         } catch (SQLiteException e) {         } catch (SQLiteException e) {
-            Toast.makeText(this, "Database unavailable", Toast.LENGTH_SHORT).show();+            Toast.makeText(this, "Database unavailable",  
 +                Toast.LENGTH_SHORT).show();
         }         }
     }     }
Line 145: Line 155:
     protected void onListItemClick(ListView l, View v, int position, long id) {     protected void onListItemClick(ListView l, View v, int position, long id) {
         super.onListItemClick(l, v, position, id);         super.onListItemClick(l, v, position, id);
-        Intent intent = new Intent(DrinkCategoryActivity.this, DrinkActivity.class);+        Intent intent = new Intent(DrinkCategoryActivity.this,  
 +            DrinkActivity.class);
         intent.putExtra(DrinkActivity.EXTRA_DRINKNO, (int) id);         intent.putExtra(DrinkActivity.EXTRA_DRINKNO, (int) id);
         startActivity(intent);         startActivity(intent);
Line 185: Line 196:
         try {         try {
             // Gain access to our app's database:             // Gain access to our app's database:
-            SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);+            SQLiteOpenHelper starbuzzDatabaseHelper =  
 +                new StarbuzzDatabaseHelper(this);
             SQLiteDatabase db = starbuzzDatabaseHelper.getWritableDatabase();             SQLiteDatabase db = starbuzzDatabaseHelper.getWritableDatabase();
  
             // Get the name, description, and image for drinkNo:             // Get the name, description, and image for drinkNo:
             Cursor cursor = db.query ("DRINK",             Cursor cursor = db.query ("DRINK",
-                    new String[] {"NAME", "DESCRIPTION", "IMAGE_RESOURCE_ID", "FAVORITE"},+                    new String[] 
 +                        {"NAME", "DESCRIPTION", "IMAGE_RESOURCE_ID", "FAVORITE"},
                     "_id = ?",                     "_id = ?",
                     new String[] {Integer.toString(drinkNo)},                     new String[] {Integer.toString(drinkNo)},
Line 225: Line 238:
             db.close();             db.close();
         } catch (SQLiteException e) {         } catch (SQLiteException e) {
-            Toast toast = Toast.makeText(this, "Database unavailable", Toast.LENGTH_SHORT);+            Toast toast = Toast.makeText(this, "Database unavailable", 
 +                Toast.LENGTH_SHORT);
             toast.show();             toast.show();
         }         }
Line 239: Line 253:
         drinkValues.put("FAVORITE", favorite.isChecked());         drinkValues.put("FAVORITE", favorite.isChecked());
  
-        SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(DrinkActivity.this);+        SQLiteOpenHelper starbuzzDatabaseHelper =  
 +            new StarbuzzDatabaseHelper(DrinkActivity.this);
  
         try {         try {
             SQLiteDatabase db = starbuzzDatabaseHelper.getWritableDatabase();             SQLiteDatabase db = starbuzzDatabaseHelper.getWritableDatabase();
-            db.update("DRINK", drinkValues, "_id = ?", new String[] {Integer.toString(drinkNo)});+            db.update("DRINK", drinkValues, "_id = ?", 
 +                new String[] {Integer.toString(drinkNo)});
             db.close();             db.close();
         } catch(SQLiteException e) {         } catch(SQLiteException e) {
-            Toast.makeText(DrinkActivity.this, "Database unavailable", Toast.LENGTH_SHORT).show();+            Toast.makeText(DrinkActivity.this, "Database unavailable", 
 +                Toast.LENGTH_SHORT).show();
         }         }
     }     }
Line 281: Line 298:
         setContentView(R.layout.activity_top_level);         setContentView(R.layout.activity_top_level);
  
-        AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {+        AdapterView.OnItemClickListener itemClickListener = 
 +            new AdapterView.OnItemClickListener() { 
             @Override             @Override
-            public void onItemClick(AdapterView<?> parent, View view, int position, long id) { +            public void onItemClick (AdapterView<?> parent, View view, 
-                if (position == 0) { +                int position, long id) { 
-                    Intent intent = new Intent(TopLevelActivity.this, DrinkCategoryActivity.class); +                    if (position == 0) { 
-                    startActivity(intent); +                        Intent intent = new Intent(TopLevelActivity.this,  
-                }+                            DrinkCategoryActivity.class); 
 +                        startActivity(intent); 
 +                    }
             }             }
         };         };
Line 298: Line 319:
         ListView listFavrotites = (ListView)findViewById(R.id.list_favorites);         ListView listFavrotites = (ListView)findViewById(R.id.list_favorites);
         try {         try {
-            SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);+            SQLiteOpenHelper starbuzzDatabaseHelper =  
 +                new StarbuzzDatabaseHelper(this);
             db = starbuzzDatabaseHelper.getReadableDatabase();             db = starbuzzDatabaseHelper.getReadableDatabase();
  
Line 308: Line 330:
  
             // Map data to list via adapter             // Map data to list via adapter
-            CursorAdapter favoriteAdapter = new SimpleCursorAdapter(TopLevelActivity.this,+            CursorAdapter favoriteAdapter = new SimpleCursorAdapter( 
 +                    TopLevelActivity.this,
                     android.R.layout.simple_list_item_1,                     android.R.layout.simple_list_item_1,
                     favoritesCursor,                     favoritesCursor,
Line 317: Line 340:
  
             // Handle click events on list items - show favorite item's activity             // Handle click events on list items - show favorite item's activity
-            listFavrotites.setOnItemClickListener(new AdapterView.OnItemClickListener() {+            listFavrotites.setOnItemClickListener( 
 +                new AdapterView.OnItemClickListener() {
                 @Override                 @Override
-                public void onItemClick(AdapterView<?> parent, View view, int position, long id) { +                public void onItemClick( 
-                    Intent intent = new Intent(TopLevelActivity.this, DrinkActivity.class); +                    AdapterView<?> parent, View view, int position, long id) { 
-                    intent.putExtra(DrinkActivity.EXTRA_DRINKNO, (int)id); +                        Intent intent =  
-                    startActivity(intent);+                            new Intent(TopLevelActivity.this, DrinkActivity.class); 
 +                        intent.putExtra(DrinkActivity.EXTRA_DRINKNO, (int)id); 
 +                        startActivity(intent); 
 +                    }
                 }                 }
-            });+            );
  
  
         } catch(SQLiteException e) {         } catch(SQLiteException e) {
-            Toast.makeText(TopLevelActivity.this, "Database unavailable", Toast.LENGTH_SHORT).show();+            Toast.makeText(TopLevelActivity.this, "Database unavailable", 
 +                Toast.LENGTH_SHORT).show();
         }         }
     }     }
Line 347: Line 375:
         super.onRestart();         super.onRestart();
         try{         try{
-            StarbuzzDatabaseHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);+            StarbuzzDatabaseHelper starbuzzDatabaseHelper = 
 +                new StarbuzzDatabaseHelper(this);
             db = starbuzzDatabaseHelper.getReadableDatabase();             db = starbuzzDatabaseHelper.getReadableDatabase();
  
Line 363: Line 392:
             favoritesCursor = newCursor;             favoritesCursor = newCursor;
         } catch(SQLiteException e) {         } catch(SQLiteException e) {
-            Toast toast = Toast.makeText(this, "Database unavailable", Toast.LENGTH_SHORT);+            Toast toast = Toast.makeText(this, "Database unavailable", 
 +                Toast.LENGTH_SHORT);
             toast.show();             toast.show();
         }         }
Line 379: Line 409:
 The idea of an AsycTask is that you can start a process that run in the background (in a different thread) and then notify the main thread when it's done so it can respond to the new state of things. This leaves the main thread available to, say, update the UI and handle user events while the process, say, waits for Flickr to respond to an API request. All that downtime the app would have spent waiting for the network to do something is instead available for user interaction. The idea of an AsycTask is that you can start a process that run in the background (in a different thread) and then notify the main thread when it's done so it can respond to the new state of things. This leaves the main thread available to, say, update the UI and handle user events while the process, say, waits for Flickr to respond to an API request. All that downtime the app would have spent waiting for the network to do something is instead available for user interaction.
  
-In creating subclasses of AsycTask, you must override the ''doInBackground'' method (it's abstract). Overriding any of the other methods is optional.+In creating subclasses of AsycTask, you must override the ''doInBackground'' method (it's abstract). Overriding any of the other methods--''onPreExecute'', ''onProgressUpdate'', and ''onPostExecute''-- is optional. These methods let you use AyncTasks to encapsulate general tasks, not just the parts of a task that run in the background.
  
-===== P. 530 ===== +===== p. 530 ===== 
-Note that the UpdateDrinkTask will be added as an Inner Class to DrinkActivity. So don't create a new ''UpdateDrinkTask.java'' file, ok?+The UpdateDrinkTask discussed here will be added as an inner class to DrinkActivity later on. So don't create a new ''UpdateDrinkTask.java'' file, ok?
  
 +===== pp. 537-538 =====
 +I've added some Toasts to mark when some things are happening. You wouldn't want to do this in production.
  
 +<file java DrinkActivity.java>
 +package com.hfad.starbuzz;
  
 +import android.content.ContentValues;
 +import android.database.Cursor;
 +import android.database.sqlite.SQLiteDatabase;
 +import android.database.sqlite.SQLiteException;
 +import android.database.sqlite.SQLiteOpenHelper;
 +import android.os.AsyncTask;
 +import android.support.v7.app.AppCompatActivity;
 +import android.os.Bundle;
 +import android.view.View;
 +import android.widget.CheckBox;
 +import android.widget.ImageView;
 +import android.widget.TextView;
 +import android.widget.Toast;
 +
 +public class DrinkActivity extends AppCompatActivity {
 +
 +    public static final String EXTRA_DRINKNO = "drinkNo";
 +
 +    @Override
 +    protected void onCreate(Bundle savedInstanceState) {
 +        super.onCreate(savedInstanceState);
 +        setContentView(R.layout.activity_drink);
 +
 +        int drinkNo = (Integer)getIntent().getExtras().get(EXTRA_DRINKNO);
 +
 +        //Create a cursor and populate Views from the cursor's data.
 +        try {
 +            // Gain access to our app's database:
 +            SQLiteOpenHelper starbuzzDatabaseHelper =
 +                new StarbuzzDatabaseHelper(this);
 +            SQLiteDatabase db = starbuzzDatabaseHelper.getWritableDatabase();
 +
 +            // Get the name, description, and image for drinkNo:
 +            Cursor cursor = db.query ("DRINK",
 +                    new String[]
 +                        {"NAME", "DESCRIPTION", "IMAGE_RESOURCE_ID", "FAVORITE"},
 +                    "_id = ?",
 +                    new String[] {Integer.toString(drinkNo)},
 +                    null, null,null);
 +
 +            // Move to the first record in the Cursor
 +            if (cursor.moveToFirst()) {
 +                // Get the drink details from the cursor
 +                String nameText = cursor.getString(0);
 +                String descriptionText = cursor.getString(1);
 +                int photoId = cursor.getInt(2);
 +                boolean isFavorite = (cursor.getInt(3) == 1);
 +
 +                // Populate the drink name
 +                TextView name = (TextView)findViewById(R.id.name);
 +                name.setText(nameText);
 +
 +                // Populate the drink description
 +                TextView description = (TextView)findViewById(R.id.description);
 +                description.setText(descriptionText);
 +
 +                // Populate the drink image
 +                ImageView photo = (ImageView)findViewById(R.id.photo);
 +                photo.setImageResource(photoId);
 +                photo.setContentDescription(nameText);
 +
 +                // Populate the favorite checkbox
 +                CheckBox favorite = (CheckBox)findViewById(R.id.favorite);
 +                favorite.setChecked(isFavorite);
 +            }
 +
 +            // Close up shop.
 +            cursor.close();
 +            db.close();
 +        } catch (SQLiteException e) {
 +            Toast toast = Toast.makeText(this, "Database unavailable",
 +                Toast.LENGTH_SHORT);
 +            toast.show();
 +        }
 +    }
 +
 +    // Update the DB's FAVORITES field for this drink.
 +    public void onFavoriteClicked(View view) {
 +        int drinkNo = (Integer)getIntent().getExtras().get("drinkNo");
 +        new UpdateDrinkTask().execute(drinkNo);
 +    }
 +
 +    // Inner class: a task to update the drink's DB record.
 +    private class UpdateDrinkTask extends AsyncTask <Integer, Void, Boolean> {
 +
 +        ContentValues drinkValues;
 +
 +        @Override
 +        protected void onPreExecute() {
 +            CheckBox favorite = (CheckBox)findViewById(R.id.favorite);
 +            drinkValues = new ContentValues();
 +            drinkValues.put("FAVORITE", favorite.isChecked());
 +            Toast.makeText(DrinkActivity.this, "Backgrounding DB operation...", 
 +                Toast.LENGTH_SHORT).show();
 +        }
 +
 +        @Override
 +        protected Boolean doInBackground(Integer... drinks) {
 +            int drinkNo = drinks[0];
 +            SQLiteOpenHelper starbuzzDatabaseHelper = 
 +                new StarbuzzDatabaseHelper(DrinkActivity.this);
 +            try {
 +                SQLiteDatabase db = starbuzzDatabaseHelper.getWritableDatabase();
 +                db.update("DRINK", drinkValues, "_id = ?",
 +                    new String[]{Integer.toString(drinkNo)});
 +                db.close();
 +                return true;
 +            } catch(SQLiteException e) {
 +                return false;
 +            }
 +        }
 +
 +        @Override
 +        protected void onPostExecute(Boolean success) {
 +            if (!success) {
 +                Toast.makeText(DrinkActivity.this, "Database unavailable", 
 +                    Toast.LENGTH_SHORT).show();
 +            } else {
 +                Toast.makeText(DrinkActivity.this, "DB update complete",
 +                    Toast.LENGTH_SHORT).show();
 +            }
 +        }
 +    }
 +}
 +
 +</file>
 +
 +===== Debug with the system log =====
 +This isn't covered until Chapter 13 in the book, but it's worth using here.
 +
 +In this final version of DrinkActivity, I use the [[android_learning:using_the_system_log|system log]] to output debug information to the console instead of using Toasts for debug messages.
 +
 +<file java DrinkActivity.java>
 +package com.hfad.starbuzz;
 +
 +import android.content.ContentValues;
 +import android.database.Cursor;
 +import android.database.sqlite.SQLiteDatabase;
 +import android.database.sqlite.SQLiteException;
 +import android.database.sqlite.SQLiteOpenHelper;
 +import android.os.AsyncTask;
 +import android.support.v7.app.AppCompatActivity;
 +import android.os.Bundle;
 +import android.util.Log;
 +import android.view.View;
 +import android.widget.CheckBox;
 +import android.widget.ImageView;
 +import android.widget.TextView;
 +import android.widget.Toast;
 +
 +public class DrinkActivity extends AppCompatActivity {
 +
 +    public static final String EXTRA_DRINKNO = "drinkNo";
 +
 +    @Override
 +    protected void onCreate(Bundle savedInstanceState) {
 +        super.onCreate(savedInstanceState);
 +        setContentView(R.layout.activity_drink);
 +
 +        int drinkNo = (Integer)getIntent().getExtras().get(EXTRA_DRINKNO);
 +
 +        //Create a cursor and populate Views from the cursor's data.
 +        try {
 +            // Gain access to our app's database:
 +            SQLiteOpenHelper starbuzzDatabaseHelper = 
 +                new StarbuzzDatabaseHelper(this);
 +            SQLiteDatabase db = starbuzzDatabaseHelper.getWritableDatabase();
 +
 +            // Get the name, description, and image for drinkNo:
 +            Cursor cursor = db.query ("DRINK",
 +                    new String[]
 +                        {"NAME", "DESCRIPTION", "IMAGE_RESOURCE_ID", "FAVORITE"},
 +                    "_id = ?",
 +                    new String[] {Integer.toString(drinkNo)},
 +                    null, null,null);
 +
 +            // Move to the first record in the Cursor
 +            if (cursor.moveToFirst()) {
 +                // Get the drink details from the cursor
 +                String nameText = cursor.getString(0);
 +                String descriptionText = cursor.getString(1);
 +                int photoId = cursor.getInt(2);
 +                boolean isFavorite = (cursor.getInt(3) == 1);
 +
 +                // Populate the drink name
 +                TextView name = (TextView)findViewById(R.id.name);
 +                name.setText(nameText);
 +
 +                // Populate the drink description
 +                TextView description = (TextView)findViewById(R.id.description);
 +                description.setText(descriptionText);
 +
 +                // Populate the drink image
 +                ImageView photo = (ImageView)findViewById(R.id.photo);
 +                photo.setImageResource(photoId);
 +                photo.setContentDescription(nameText);
 +
 +                // Populate the favorite checkbox
 +                CheckBox favorite = (CheckBox)findViewById(R.id.favorite);
 +                favorite.setChecked(isFavorite);
 +            }
 +
 +            // Close up shop.
 +            cursor.close();
 +            db.close();
 +        } catch (SQLiteException e) {
 +            Toast toast = Toast.makeText(this, "Database unavailable",
 +                Toast.LENGTH_SHORT);
 +            toast.show();
 +        }
 +    }
 +
 +    // Update the DB's FAVORITES field for this drink.
 +    public void onFavoriteClicked(View view) {
 +        int drinkNo = (Integer)getIntent().getExtras().get("drinkNo");
 +        new UpdateDrinkTask().execute(drinkNo);
 +    }
 +
 +    // Inner class: a task to update the drink's DB record.
 +    private class UpdateDrinkTask extends AsyncTask <Integer, Void, Boolean> {
 +
 +        ContentValues drinkValues;
 +
 +        @Override
 +        protected void onPreExecute() {
 +            CheckBox favorite = (CheckBox)findViewById(R.id.favorite);
 +            drinkValues = new ContentValues();
 +            drinkValues.put("FAVORITE", favorite.isChecked());
 +            Log.d("DB", "Backgrounding DB operation...");
 +        }
 +
 +        @Override
 +        protected Boolean doInBackground(Integer... drinks) {
 +            int drinkNo = drinks[0];
 +            SQLiteOpenHelper starbuzzDatabaseHelper =
 +                new StarbuzzDatabaseHelper(DrinkActivity.this);
 +            try {
 +                SQLiteDatabase db = starbuzzDatabaseHelper.getWritableDatabase();
 +                db.update("DRINK", drinkValues, "_id = ?",
 +                    new String[]{Integer.toString(drinkNo)});
 +                db.close();
 +                return true;
 +            } catch(SQLiteException e) {
 +                return false;
 +            }
 +        }
 +
 +        @Override
 +        protected void onPostExecute(Boolean success) {
 +            if (!success) {
 +                Toast.makeText(DrinkActivity.this, "Database unavailable",
 +                    Toast.LENGTH_SHORT).show();
 +            } else {
 +                Log.d("DB", "DB update complete");
 +            }
 +        }
 +    }
 +}
 +
 +</file>
android_learning/headfirst_android_development_notes/chapter_12.1461464736.txt.gz · Last modified: 2016/04/24 02:25 by mithat

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki