CS 696 Mobile Phone Application DevelopmentFall Semester, 2009Doc 10 ThreadsOct 1, 2009Copyright ©, All rights reserved. 2009 SDSU & Roger Whitney, 5500 Campanile Drive, San Diego, CA 92182-7700 USA. OpenContent (http://www.opencontent.org/opl.shtml) license defines the copyright on this document.References2The Busy Coder's Guide to Android Development, V2.1, Mark L. Murphy3Code QualityFormating & Names4 public void cal(){ //messageText01.setText(messageText.getText()); Double billAmount = null; Double tipPercent = null; Double totalAmount = null; if(messageText.getText().toString().length() < 1) { clr(); } else {Names5 messageText = (EditText) findViewById(R.id.edit); messageText01 = (EditText) findViewById(R.id.EditText01); messageText02 = (EditText) findViewById(R.id.EditText02); cal = (Button) findViewById(R.id.Cal); clr = (Button) findViewById(R.id.Clear);6Threads7Activity code runs in UI thread8Do not interact with Views in your threads9Android Background ToolsJava threadsHandlerMessagesRunnablesAsyncTaskServicesHandler10Attached to thread it is created inProcesses Message objectsRunnable objectsMain UsesSchedule messages/runnables to be executed as in the futureEnqueue an action to be performed on a different threadHandler Scheduling11post(Runnable)postAtTime(Runnable, long)postDelayed(Runnable, long)sendEmptyMessage(int)sendMessage(Message)sendMessageAtTime(Message, long)sendMessageDelayed(Message, long)ProgressBar Example12Just shows a progress bar progressingExample from The Busy Coder's Guide to Android Development, V2.1, Mark L. MurphyThreadExample13public class ThreadExample extends Activity { ProgressBar progressView; boolean isRunning = false; Handler handler = new Handler() { public void handleMessage(Message empty) { progressView.incrementProgressBy(5); } }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); progressView = (ProgressBar) findViewById(R.id.progress); } public void onStop() { super.onStop(); isRunning = false; }Example from The Busy Coder's Guide to Android Development, V2.1, Mark L. MurphyThreadExample14 public void onStart() { super.onStart(); progressView.setProgress(0); Thread background = new Thread(new Runnable() { public void run() { try { for (int i = 0; i < 20 && isRunning; i++) { Thread.sleep(1000); handler.sendMessage(handler.obtainMessage()); } } catch (Throwable t) {// just end } } }); isRunning = true; background.start(); }}Sending Text Messages to the future15Rather than use a thread usesendMessageDelayedSends data in the message using BundleSending Text The Hard Way16public class ThreadExample extends Activity { Handler handler = new Handler() { public void handleMessage(Message word) { String text = word.getData().getString("key"); Toast.makeText(ThreadExample.this, text, Toast.LENGTH_SHORT).show(); } }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void onStart() { super.onStart(); String[] text = { "Bat", "cat", "dat", "fat", "hat", "mat" }; for (int i = 0; i < text.length; i++) { Bundle data = new Bundle(); data.putString("key", text[i]); Message word = new Message(); word.setData(data); handler.sendMessageDelayed(word, 1000 * (i + 1)); } }}Read the documentation to find the easy wayProgress Dialog17Displays a Progress DialogUses Message what to transmit dataThreadExample18public class ThreadExample extends Activity { ProgressDialog waitDialog; private static final int WAIT_DIALOG_KEY = 0; Handler handler = new Handler() { public void handleMessage(Message command) { if (command.what == 0) showDialog(WAIT_DIALOG_KEY); else waitDialog.dismiss(); } }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }ThreadExample19 protected Dialog onCreateDialog(int id) { switch (id) { case WAIT_DIALOG_KEY: { waitDialog = new ProgressDialog(this); waitDialog.setMessage("Please wait while loading..."); waitDialog.setIndeterminate(true); waitDialog.setCancelable(true); return waitDialog; } } return null; } public void onStart() { super.onStart(); Message on = new Message(); on.what = 0; handler.sendMessageDelayed(on, 1000); Message off = new Message(); off.what = 1; handler.sendMessageDelayed(off, 8000); }}20AsyncTaskAsyncTask21Replaces threads & MessagesAndroid 1.5Subclass AsyncTaskonPreExecute()Run in UI threadDone firstdoInBackground(Params...)Run in seperate threadpublishProgress(Progress...)Call in doInBackground() to register progressonProgressUpdate(Progress...)Run in UI threadCalled by publisheProgressonPostExecute(Result)Run in UI threadRun after doInBackground endsRules22The AsyncTask sublcass instance must be created on the UI threadexecute(Params...) Starts the taskMust be invoked on the UI threadDo not call manuallyonPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)The task can be executed only onceAsyncTask Types23private class SampleTask extends AsyncTask<Params, Progress, Result>ParamsType of argument for doInBackground()execute()ProgressType of argument for publishProgress()onProgressUpdate()ResultReturn type for doInBackground()Type of argument for onPostExecute()How it Works24UI Thread Background Threadprivate class SampleTask extends AsyncTask<Params, Progress, Result>new SampleTask().execute(paramsType);onPreExecute()doInBackground(Params... stuff){blahpublishProgress(progressType);blahreturn x;}onProgressUpdate(Progress... values)onPostExecute(Result result)Example25Loops in the background and displays ToastThreadExample26public class ThreadExample extends Activity { private class SampleTask extends AsyncTask<String, String, Void> { protected Void doInBackground(String... words) { for (String word : words) { publishProgress(word); SystemClock.sleep(1000); } return (null); } protected void onPostExecute(Void unused) { Toast.makeText(ThreadExample.this, "Done", Toast.LENGTH_SHORT) .show(); }ThreadExample27 protected void onPreExecute() { Toast.makeText(ThreadExample.this, "Start",
View Full Document