灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3524回复:0

如何构建一个结构清晰的Android程序

楼主#
更多 发布于:2012-09-06 14:05


随着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

喜欢0 评分0
游客

返回顶部