如何构建一个结构清晰的Android程序
3759 点击·0 回帖
![]() | ![]() | |
![]() | 随着Android程序功能模块越来越多,模块之间的交互也日渐平常,一个结构在开始就设计良好的系统,不会因为上述的原因就出现大量的复制粘贴,如果出现大量的复制粘贴,那说明这个系统的结构设计是失败的。以前在写一个电子商务类联网应用的时候,每个Activity都有一个AsyncTask的异步线程去执行联网下载数据,解析数据,每当新增一个功能模块的时候就会出现大量的代码复制粘贴。导致程序难以维护。所以对于这些需要处理大量耗时工作的应用,提出了一个由数据中心负责接收数据请求,处理好数据后将数据异步返回的机制。 初步的设想是将数据中心放在Service中,然后通过binderService,每个想要和Service通信的Activity都可以连接到Service中。然后通过Handler发送数据请求给Service,Service根据请求,处理数据,然后通过BroadcastReceiver机制将数据返回给对此类数据感兴趣的对象。 一下是实现的关键代码: 01 package com.hxcy; 02 03 import Android.app.Service; 04 import Android.content.Intent; 05 import Android.os.Binder; 06 import Android.os.Bundle; 07 import Android.os.Handler; 08 import Android.os.Handler.Callback; 09 import Android.os.IBinder; 10 import Android.os.Message; 11 import Android.support.v4.content.LocalBroadcastManager; 12 13 import com.hxcy.model.Person; 14 15 public class DataCenterService extends Service implements Callback { 16 private Handler msgHandler; 17 18 private MyBinder binder; 19 20 public static final int GET_PERSON_DATA = 0X001; 21 public static final int GET_COUNTRY_DATA = 0X002; 22 23 public static final String GET_PERSON_ACTION = "com.hxcy.action.person"; 24 public static final String GET_COUNTRY_ACTION = "com.hxcy.action.country"; 25 26 private LocalBroadcastManager mLocalBroadcastManager; 27 28 public class MyBinder extends Binder { 29 public Handler getMessageHandler() { 30 return msgHandler; 31 } 32 } 33 34 @Override 35 public IBinder onBind(Intent intent) { 36 binder = new MyBinder(); 37 msgHandler = new Handler(this); 38 mLocalBroadcastManager = DataCenterApplication 39 .getLocalBroadcastManager(); 40 return binder; 41 } 42 43 @Override 44 public boolean handleMessage(Message msg) { 45 switch (msg.what) { 46 case GET_PERSON_DATA: 47 new PersonDataThrea().start(); 48 return true; 49 case GET_COUNTRY_DATA: 50 51 return true; 52 default: 53 return false; 54 } 55 } 56 57 class PersonDataThrea extends Thread { 58 59 @Override 60 public void run() { 61 62 Intent intent = new Intent(GET_PERSON_ACTION); 63 Bundle bundle = new Bundle(); 64 Person[] persons = new Person[5]; 65 for (int i = 0; i < 5; i++) { 66 Person person = new Person(); 67 person.setAge(i + 20); 68 person.setName(i + " person"); 69 person.setId(i + ":" + System.currentTimeMillis()); 70 persons = person; 71 } 72 bundle.putParcelableArray("persons", persons); 73 intent.putExtras(bundle); 74 mLocalBroadcastManager.sendBroadcast(intent); 75 76 } 77 78 } 79 } 01 package com.hxcy; 02 03 import Android.app.Activity; 04 import Android.content.BroadcastReceiver; 05 import Android.content.ComponentName; 06 import Android.content.Context; 07 import Android.content.Intent; 08 import Android.content.IntentFilter; 09 import Android.content.ServiceConnection; 10 import Android.os.Bundle; 11 import Android.os.Handler; 12 import Android.os.IBinder; 13 import Android.support.v4.content.LocalBroadcastManager; 14 15 import com.hxcy.model.Person; 16 import com.hxcy.util.LogUtil; 17 18 public class DataCenterDemoActivity extends Activity { 19 private LocalBroadcastManager mLocalBroadcastManager; 20 private Handler msgHandler; 21 private BroadcastReceiver personDataReceiver=new BroadcastReceiver() { 22 23 @Override 24 public void onReceive(Context context, Intent intent) { 25 Bundle bundle=intent.getExtras(); 26 if(bundle!=null){ 27 Person[] persons=(Person[]) bundle.getParcelableArray("persons"); 28 for(int j=persons.length-1;j>=0;j--){ 29 LogUtil.d(getApplicationContext(), persons[j]+""); 30 } 31 32 } 33 } 34 }; 35 36 private ServiceConnection conn=new ServiceConnection() { 37 38 @Override 39 public void onServiceDisconnected(ComponentName name) { 40 // TODO Auto-generated method stub 41 42 } 43 44 @Override 45 public void onServiceConnected(ComponentName name, IBinder service) { 46 msgHandler=((DataCenterService.MyBinder)service).getMessageHandler(); 47 48 msgHandler.postDelayed(refreshPersonData, 3000); 49 } 50 }; 51 @Override 52 public void onCreate(Bundle savedInstanceState) { 53 super.onCreate(savedInstanceState); 54 setContentView(R.layout.main); 55 mLocalBroadcastManager=DataCenterApplication.getLocalBroadcastManager(); 56 57 mLocalBroadcastManager.registerReceiver(personDataReceiver, new IntentFilter(DataCenterService.GET_PERSON_ACTION)); 58 bindService(new Intent(this,DataCenterService.class), conn, BIND_AUTO_CREATE); 59 } 60 61 Runnable refreshPersonData =new Runnable() { 62 63 @Override 64 public void run() { 65 msgHandler.sendEmptyMessage(DataCenterService.GET_PERSON_DATA); 66 msgHandler.postDelayed(this, 3000); 67 } 68 }; 69 } package com.hxcy; import Android.app.Application; import Android.support.v4.content.LocalBroadcastManager; public class DataCenterApplication extends Application { private static LocalBroadcastManager mLocalBroadcastManager; @Override public void onCreate() { super.onCreate(); mLocalBroadcastManager=LocalBroadcastManager.getInstance(this); } public static LocalBroadcastManager getLocalBroadcastManager(){ return mLocalBroadcastManager; } } Person类: view sourceprint? 01 package com.hxcy.model; 02 03 import Android.os.Parcel; 04 import Android.os.Parcelable; 05 06 public class Person implements Parcelable { 07 private String name; 08 private int age; 09 private String id; 10 11 12 public String getName() { 13 return name; 14 } 15 16 public void setName(String name) { 17 this.name = name; 18 } 19 20 public int getAge() { 21 return age; 22 } 23 24 public void setAge(int age) { 25 this.age = age; 26 } 27 28 public String getId() { 29 return id; 30 } 31 32 public void setId(String id) { 33 this.id = id; 34 } 35 36 @Override 37 public int describeContents() { 38 return 0; 39 } 40 41 @Override 42 public String toString() { 43 return "Person [name=" + name + ", age=" + age + ", id=" + id + "]"; 44 } 45 46 @Override 47 public void writeToParcel(Parcel dest, int flags) { 48 dest.writeString(id); 49 dest.writeString(name); 50 dest.writeInt(age); 51 52 } 53 54 public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { 55 56 @Override 57 public Person createFromParcel(Parcel source) { 58 // TODO Auto-generated method stub 59www.atcpu.com Person person=new Person(); 60 person.setId(source.readString()); 61 person.setName(source.readString()); 62 person.setAge(source.readInt()); 63 return person; 64 } 65 66 @Override 67 public Person[] newArray(int size) { 68 69 return new Person[size]; 70 } 71 72 }; 73 } 作者:fneg | |
![]() | ![]() |