标签(空格分隔): android团队开发技巧 android
前景
记得一开始写安卓的时候,我都是像很多人一样,直接 new 一个 intent ,然后给用 intent.putExtra 方法来传递参数给 下一个 activity。如下代码:
public class OneActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, TwoActivity.class);
intent.putExtra("serverId", 20);
startActivity(intent);
}
}
public class TwoActivity extends Activity {
private ObjectBean mData;//数据源,实现到界面
private String mTitle;
private int mServerId;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mServerId = getIntent().getIntExtra("serverId", 0);
//加载服务器数据,伪代码,主要看逻辑
requestRemoteData(mServerId, new Listener(){
public void onComplete(RemoteBean bean){
mData = bean.data;
mTitle = bean.title;
setDataToUi();
}
});
}
private void setDataToUi(){
//把 mData 和 mTitle 数据都设置到 ui 上面
//.....
}
}
问题
看上面代码的确没什么问题,但是当项目越来越大,需求越来越复杂,接手人数越来越多的时候,就会出现一堆的问题。
现在需求来了,加入 TwoActivity
的数据有可能不来自网络了,来自本地,但界面几乎一样的。面对这样的需求,有人会开一个 activity,但是如果当 activity 的逻辑极其复杂的时候,这样维护2分代码,成本会非常大。所以当页面差别非常小的时候应该采用同一个 activity。于是面对上面的需求,我们会增加一个参数,标志这个是加载本地数据还是服务器数据。代码:
public class OneActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, TwoActivity.class);
intent.putExtra("serverId", 20);
intent.putExtra("launchMode", 0);
startActivity(intent);
}
}
public class ThreeActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, TwoActivity.class);
intent.putExtra("title", "欢迎光临");
intent.putExtra("data", mData);
intent.putExtra("launchMode", 1);
startActivity(intent);
}
}
public class TwoActivity extends Activity {
private ObjectBean mData;//数据源,实现到界面
private String mTitle;
private int mServerId;
private int mLaunchMode = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mServerId = getIntent().getIntExtra("serverId", 0);
mData = getIntent().getSerializableExtra("data");
mTitle = getIntent().getStringExtra("title");
mLaunchMode = getIntent().getIntExtra("launchModel", 0);
if(mLaunchMode == 0){
//加载服务器数据,伪代码,主要看逻辑
requestRemoteData(mServerId, new Listener(){
public void onComplete(RemoteBean bean){
mData = bean.data;
mTitle = bean.title;
setDataToUi();
}
});
} else {
setDataToUi();
}
}
private void setDataToUi(){
//把 mData 和 mTitle 数据都设置到 ui 上面
//.....
}
}
这样子就实现,同一个页面不同逻辑的需求了,可以看到引入了 mLaunchMode
标志变量来标志他的业务逻辑。的确比用多个activity 方便了。但是问题来了,这样子别人怎么知道放什么到 intent 里面?假如 TwoActivity
是我写的,OneActivity
, ThreeActivity
是另外一个同事写得, 他可能放serverId
, data
,title
, launchMode
的组合种情况,这样他需要启动我的页面就要来询问我要传什么参数到我的页面了,这样子大大增加加了沟通成本。
解决问题
为了解决这样的问题,我们在目标 activity 增加启动该页面的静态方法,这样子同事之间再也不会不知道启动别人的页面要传什么参数了,代码如下:
public class OneActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TwoActivity.launch(this, 20);
}
}
public class ThreeActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TwoActivity.launch(this, "欢迎光临", mData);
}
}
public class TwoActivity extends Activity {
public static final String EXTRA_SERVER_ID = "EXTRA_SERVER_ID";
public static final String EXTRA_TITLE = "EXTRA_TITLE";
public static final String EXTRA_DATA = "EXTRA_DATA";
public static final String EXTRA_LAUCH_MODE = "EXTRA_LAUCH_MODE";
public static void launch(Activity context, int serverId){
Intent intent = new Intent(context, TwoActivity.class);
intent.putExtra(EXTRA_SERVER_ID, serverId);
intent.putExtra(EXTRA_LAUCH_MODE, 0);
startActivity(intent);
}
public static void launch(Activity context, String title, ObjectBean data){
Intent intent = new Intent(this, TwoActivity.class);
intent.putExtra(EXTRA_TITLE, title);
intent.putExtra(EXTRA_DATA, data);
intent.putExtra(EXTRA_LAUCH_MODE, 1);
startActivity(intent);
}
private ObjectBean mData;//数据源,实现到界面
private String mTitle;
private int mServerId;
private int mLaunchMode = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mServerId = getIntent().getIntExtra(EXTRA_SERVER_ID, 0);
mData = (ObjectBean) getIntent().getSerializableExtra(EXTRA_DATA);
mTitle = getIntent().getStringExtra(EXTRA_TITLE);
mLaunchMode = getIntent().getIntExtra(EXTRA_LAUCH_MODE, 0);
if(mLaunchMode == 0){
//加载服务器数据,伪代码,主要看逻辑
requestRemoteData(mServerId, new Listener(){
public void onComplete(RemoteBean bean){
mData = bean.data;
mTitle = bean.title;
setDataToUi();
}
});
} else {
setDataToUi();
}
}
private void setDataToUi(){
//把 mData 和 mTitle 数据都设置到 ui 上面
//.....
}
}
看到上面做了这样的更改,以后同事互相启用对方的页面变得非常简单,你只要打 launch 你就知道目标页面的各种启用方式。而且也不会因为传参数的时候参数名写错,目标页面收不到,等问题,减少很多 bug 的出现。
网友评论