android design pattern
Click here to load reader
-
Upload
lucas-xu -
Category
Technology
-
view
4.793 -
download
2
Transcript of android design pattern
Android Design
Pattern Lucas Xu
1
In a nutshell MVC
MVVM
Observer
Adapter
Façade
Bridge
Factory
Template
Composition
Decorator
2
MVC
Model: data
View: UI
Controller: Logic
3
MVC - View res/layout/main.xml
http://developer.android.com/resources/tutorials/views/hello-gridview.html
<?xml version="1.0" encoding="utf-8"?>
<GridView
xmlns:android="http://schemas.android.com/apk/
res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
4
MVC - Controller
http://developer.android.com/resources/tutorials/views/hello-listview.html
HelloGridView.java
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int
position, long id) {
Toast.makeText(HelloGridView.this, "" + position,
Toast.LENGTH_SHORT).show();
}
});
}
5
MVC - Model
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the
Adapter
public View getView(int position, View convertView,
ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled,
initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new
GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CR
OP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
return imageView;
}
// references to our images
private Integer[] mThumbIds = {
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7
};
}
6
MVC: all in one
ListActiviy
Ref:
http://www.ideasandroid.com/archives/295
http://developer.android.com/reference/android/app/ListActivity.html
7
Exercise
Write your custom GridActivity
Variant – MVVM Model View ViewModel
8
Ref:
http://en.wikipedia.org/wiki/Model_View_ViewModel
http://www.codeproject.com/KB/android/androidbinding.aspx
Android Binding
MVVM (cont’d)
public static interfaceSimpleCursorAdapter
bindView(View view, Context context, Cursor
cursor)
ViewBinder
setViewValue(View view, Object data, String
textRepresentation)
9
Ref:
http://developer.android.com/reference/android/widget/SimpleCursorAdapter.ViewBinder.html
Observer BroadCastReciever
Sensor Listener
OnClickListener onClick
OnCreateMenuListener onCreateContextMenu
AsyncTask onProgressUpdate, onPostExecute
Activity lifecycle callbacks (onStart, onResume, etc.) although with only one dedicated subscriber.
?Many observerables support only one observer, how to extend? View.setOnClickListener(new OnClickListener())…
10
Observer (cont’d)
Handler
handleMessage()
sendMessage()
Single thread model v.s. Multiple thread model
Update UI in UI thread
Looper, Handler , MessageQueue
Kill Thread
11
Observer (cont’d)
UI Sync:
ES 文件浏览器
ListView, GridView, etc,
Delete, add, rename file .
App alliance
App downloading
Downloading cancelled/ failed
App installed
12
Adapter
View
AdapterView
ExpandableListView
Gallery
GridView
ListView
Spinner
13
Data
Adapter
View
ListView
GridView
CustomView
Data Source
Content Provider
SharedPreference
Resources
SQLite
File System
public interfaceAdapter abstract int getCount()
abstract Object getItem(int position)
abstract long getItemId(int position)
abstract int getItemViewType(int position)
abstract View getView(int
position, View convertView, ViewGroup parent)
abstract int getViewTypeCount()
abstract boolean hasStableIds()
abstract boolean isEmpty()
abstract void registerDataSetObserver(DataSetObserver observer)
abstract void unregisterDataSetObserver(DataSetObserver observer)
14
Adapter (cont’)
ArrayAdapter<T>
BaseAdapter
CursorAdapter
HeaderViewListAdapter
ListAdapter
ResourceCursorAdapter
SimpleAdapter
SimpleCursorAdapter
SpinnerAdapter
WrapperListAdapter
Façade
A facade is an object that provides a simplified interface to a larger body of code, such as a class library.
wrap a poorly-designed collection of APIs with a single well-designed API (as per task needs).
Hide Complexity
App network
ExchangeViewManager
15
Façade (cont’d)
Android Media Framework
16
Bridge "decouple an abstraction from
its implementation so that the two can
vary independently“
17
Ad
ap
ter
CursorAdapter
SimpleCursorAdapter
ArrayAdapter
Ad
ap
terV
iew
AdapterViewFlipper
ExpandableListView
Gallery
Factory Method
Defer instantiation to subclasses
18
View
Activity
ListView
OnCreate()
ListActivity
OnCreate()
...
View= FactoryMethod()
...
return new ListView
Factory Method (cont’d)
View.
protected Dialog onCreateDialog(int id)
Builder AlertDialog.Builder builder = new
AlertDialog.Builder(this);
19
Template
Activity
onCreate()
AsyncTask
doInBackground()
20
Composition
Group sub objects, treated as a single
instance
View, View Group, etc.
21
Composition (cont’d)
View
ViewGroup
? Why does ViewGroup subclass View,
what pattern is used?
?交换的小把手有很多样式,用哪种设计模式?
22
public abstract class ViewGroup extends View implements ViewParent{ private View[] mChildren; … }
Reference:
GOF: Design Pattern, chap 2
23
http://www.adakoda.com/adakoda/2010/01/20/ASPH_AW_REV1.pdf
Decorator
java.io.BufferedInputStream(InputStream)
java.io.DataInputStream(InputStream)
java.io.BufferedOutputStream(OutputStre
am)
java.util.zip.ZipOutputStream(OutputStrea
m)
24
25