android design pattern

25

Click here to load reader

Transcript of android design pattern

Page 1: android design pattern

Android Design

Pattern Lucas Xu

1

Page 2: android design pattern

In a nutshell MVC

MVVM

Observer

Adapter

Façade

Bridge

Factory

Template

Composition

Decorator

2

Page 3: android design pattern

MVC

Model: data

View: UI

Controller: Logic

3

Page 4: android design pattern

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

Page 5: android design pattern

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

Page 6: android design pattern

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

Page 7: android design pattern

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

Page 10: android design pattern

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

Page 11: android design pattern

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

Page 12: android design pattern

Observer (cont’d)

UI Sync:

ES 文件浏览器

ListView, GridView, etc,

Delete, add, rename file .

App alliance

App downloading

Downloading cancelled/ failed

App installed

12

Page 14: android design pattern

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

Page 15: android design pattern

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

Page 16: android design pattern

Façade (cont’d)

Android Media Framework

16

Page 18: android design pattern

Factory Method

Defer instantiation to subclasses

18

View

Activity

ListView

OnCreate()

ListActivity

OnCreate()

...

View= FactoryMethod()

...

return new ListView

Page 19: android design pattern

Factory Method (cont’d)

View.

protected Dialog onCreateDialog(int id)

Builder AlertDialog.Builder builder = new

AlertDialog.Builder(this);

19

Page 20: android design pattern

Template

Activity

onCreate()

AsyncTask

doInBackground()

20

Page 21: android design pattern

Composition

Group sub objects, treated as a single

instance

View, View Group, etc.

21

Page 22: android design pattern

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

Page 23: android design pattern

23

http://www.adakoda.com/adakoda/2010/01/20/ASPH_AW_REV1.pdf

Page 24: android design pattern

Decorator

java.io.BufferedInputStream(InputStream)

java.io.DataInputStream(InputStream)

java.io.BufferedOutputStream(OutputStre

am)

java.util.zip.ZipOutputStream(OutputStrea

m)

24

Page 25: android design pattern

25