android design pattern

Post on 10-May-2015

4.793 views 2 download

Tags:

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

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

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

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