cs 696 mobile phone application development fall semester
TRANSCRIPT
![Page 1: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/1.jpg)
CS 696 Mobile Phone Application DevelopmentFall Semester, 2009
Doc 10 ThreadsOct 1, 2009
Copyright ©, 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.
![Page 2: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/2.jpg)
References
2
The Busy Coder's Guide to Android Development, V2.1, Mark L. Murphy
![Page 3: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/3.jpg)
3
Code Quality
![Page 4: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/4.jpg)
Formating & Names
4
public void cal(){ //messageText01.setText(messageText.getText()); Double billAmount = null; Double tipPercent = null; Double totalAmount = null; if(messageText.getText().toString().length() < 1) { clr(); } else {
![Page 5: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/5.jpg)
Names
5
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);
![Page 6: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/6.jpg)
6
Threads
![Page 7: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/7.jpg)
7
Activity code runs in UI thread
![Page 8: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/8.jpg)
8
Do not interact with Views in your threads
![Page 9: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/9.jpg)
9
Android Background Tools
Java threadsHandler
MessagesRunnables
AsyncTask
Services
![Page 10: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/10.jpg)
Handler
10
Attached to thread it is created in
Processes Message objectsRunnable objects
Main Uses
Schedule messages/runnables to be executed as in the future
Enqueue an action to be performed on a different thread
![Page 11: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/11.jpg)
Handler Scheduling
11
post(Runnable)postAtTime(Runnable, long)postDelayed(Runnable, long)sendEmptyMessage(int)sendMessage(Message)sendMessageAtTime(Message, long)sendMessageDelayed(Message, long)
![Page 12: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/12.jpg)
ProgressBar Example
12
Just shows a progress bar progressing
Example from The Busy Coder's Guide to Android Development, V2.1, Mark L. Murphy
![Page 13: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/13.jpg)
ThreadExample
13
public 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. Murphy
![Page 14: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/14.jpg)
ThreadExample
14
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(); }
}
![Page 15: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/15.jpg)
Sending Text Messages to the future
15
Rather than use a thread usesendMessageDelayed
Sends data in the message using Bundle
![Page 16: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/16.jpg)
Sending Text The Hard Way
16
public 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 way
![Page 17: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/17.jpg)
Progress Dialog
17
Displays a Progress DialogUses Message what to transmit data
![Page 18: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/18.jpg)
ThreadExample
18
public 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); }
![Page 19: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/19.jpg)
ThreadExample
19
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); }}
![Page 20: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/20.jpg)
20
AsyncTask
![Page 21: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/21.jpg)
AsyncTask
21
Replaces threads & MessagesAndroid 1.5
Subclass AsyncTask
onPreExecute()Run in UI threadDone first
doInBackground(Params...)Run in seperate thread
publishProgress(Progress...)Call in doInBackground() to register progress
onProgressUpdate(Progress...)Run in UI threadCalled by publisheProgress
onPostExecute(Result)Run in UI threadRun after doInBackground ends
![Page 22: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/22.jpg)
Rules
22
The AsyncTask sublcass instance must be created on the UI thread
execute(Params...) Starts the taskMust be invoked on the UI thread
Do not call manuallyonPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)
The task can be executed only once
![Page 23: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/23.jpg)
AsyncTask Types
23
private 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()
![Page 24: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/24.jpg)
How it Works
24
UI Thread Background Thread
private 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)
![Page 25: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/25.jpg)
Example
25
Loops in the background and displays Toast
![Page 26: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/26.jpg)
ThreadExample
26
public 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(); }
![Page 27: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/27.jpg)
ThreadExample
27
protected void onPreExecute() { Toast.makeText(ThreadExample.this, "Start", Toast.LENGTH_SHORT) .show(); }
protected void onProgressUpdate(String... word) { Toast.makeText(ThreadExample.this, word[0], 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" }; new SampleTask().execute(text); }}
![Page 28: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/28.jpg)
Just For Fun
28
Dynamically updateList View
![Page 29: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/29.jpg)
The Task
29
public class ThreadExample extends ListActivity { private class SampleTask extends AsyncTask<Void, String, Void> { String[] items = { "Gautama Buddha", "Kalki", "Krishna", "Kurma", "Matsya", "Narasimha", "Parashurama", "Rama", "Vamana", "Varaha" };
protected Void doInBackground(Void... notused) { for (String word : items) { publishProgress(word); SystemClock.sleep(2500); } return (null); }
protected void onPostExecute(Void unused) { Toast.makeText(ThreadExample.this, "Done", Toast.LENGTH_SHORT) .show(); }
protected void onProgressUpdate(String... word) { listAdapter.add(word[0]); } }
Based on an example from The Busy Coder's Guide to Android Development, V2.1, Mark L. Murphy
![Page 30: CS 696 Mobile Phone Application Development Fall Semester](https://reader035.vdocuments.us/reader035/viewer/2022081400/555802f5d8b42a200d8b533d/html5/thumbnails/30.jpg)
The Activity
30
private ArrayAdapter<String> listAdapter;
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>()); setListAdapter(listAdapter); new SampleTask().execute(); }}