需求(查询用户账号信息):
用户输入账号,点击按钮可进行查询账号信息,如果查询成功,则将数据展示在界面上;若果查询数据失败,则在界面上提示获取数据失败。
界面如下:
不适用框架实现需求
NormalActivity
-
获取用于输入的信息
-
展示获取信息成功界面
-
展示获取信息失败界面
-
查询用户数据
-
业务逻辑
结构图如下:
1.//账号信息
2.public class Account {
3. private String name;//账号名称
4. private int level;//账号等级
5.
6. public String getName() {
7. return name;
8. }
9.
10. public void setName(String name) {
11. this.name = name;
12. }
13.
14. public int getLevel() {
15. return level;
16. }
17.
18. public void setLevel(int level) {
19. this.level = level;
20. }
21.}
1.public interface MCallBack {
2. void onSuccess(Account account);
3.
4. void onFailed();
5.}
1.public class NormalActivity extends AppCompatActivity implements View.OnClickListener {
2. //展示查询结果
3. private TextView mTvResult;
4. //用户输入信息的输入框
5. private EditText mEtAccount;
6.
7. @Override
8. protected void onCreate(@Nullable Bundle savedInstanceState) {
9. super.onCreate(savedInstanceState);
10. setContentView(R.layout.activity_normal);
11. initView();
12. }
13.
14. //初始化View
15. private void initView() {
16. mTvResult = findViewById(R.id.tv_result);
17. mEtAccount = findViewById(R.id.et_account);
18. findViewById(R.id.btn_getAccount).setOnClickListener(this);
19. }
20.
21. @Override
22. public void onClick(View v) {
23. getAccountData(getUserInput(), new MCallBack() {
24. @Override
25. public void onSuccess(Account account) {
26. showSuccessPage(account);
27. }
28.
29. @Override
30. public void onFailed() {
31. showFailedPage();
32. }
33. });
34. }
35.
36. //获取用户输入信息
37. private String getUserInput() {
38. return mEtAccount.getText().toString();
39. }
40.
41. //展示获取数据成功的界面
42. private void showSuccessPage(Account account) {
43. mTvResult.setText("用户账号:" + account.getName() + "|"
44. + "用户等级:" + account.getLevel());
45. }
46.
47. //展示获取数据失败的界面
48. private void showFailedPage() {
49. mTvResult.setText("获取数据失败");
50. }
51.
52. //模拟查询账号数据
53. private void getAccountData(String accountName, MCallBack callBack) {
54. Random random = new Random();
55. boolean isSuccess = random.nextBoolean();
56. if (isSuccess) {
57. Account account = new Account();
58. account.setName(accountName);
59. account.setLevel(100);
60. callBack.onSuccess(account);
61. } else {
62. callBack.onFailed();
63. }
64. }
}
1.public class MainActivity extends AppCompatActivity {
2. @Override
3. protected void onCreate(Bundle savedInstanceState) {
4. super.onCreate(savedInstanceState);
5. setContentView(R.layout.activity_main);
6. findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {
7. @Override
8. public void onClick(View v) {
9. Intent intent = new Intent(MainActivity.this, NormalActivity.class);
10. startActivity(intent);
11. }
12. });
13. }
14.}
1.<?xml version="1.0" encoding="utf-8"?>
2.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:layout_width="match_parent"
4. android:layout_height="match_parent"
5. android:orientation="vertical">
6.
7. <EditText
8. android:id="@+id/et_account"
9. android:layout_width="match_parent"
10. android:layout_height="wrap_content"
11. android:layout_marginTop="50dp"
12. android:hint="请输入要查询的账号" />
13.
14. <Button
15. android:id="@+id/btn_getAccount"
16. android:layout_width="wrap_content"
17. android:layout_height="wrap_content"
18. android:layout_gravity="center_horizontal"
19. android:layout_marginTop="80dp"
20. android:text="获取账号信息" />
21.
22. <TextView
23. android:id="@+id/tv_result"
24. android:layout_width="wrap_content"
25. android:layout_height="wrap_content"
26. android:layout_gravity="center_horizontal"
27. android:layout_marginTop="80dp"
28. android:hint="账号信息暂未获取" />
29.
30.</LinearLayout>
MVC框架模型
MVC(Model View Controller)
模型(model)-视图(view)-控制器(controller)
- Controller:Activity、Fragment
- View:layout、View控件
- Model:数据处理(网络请求、SQL等)
优点: 一定程度上实现了Model与View的分离,降低了代码的耦合性。
缺点: Controller与View难以完全解耦,并且随着项目复杂度的提升,Contrllor将越来越臃肿。
MVCActivity(C层)
- 业务逻辑处理
- 获取用户输入
- 展示成功页面
- 展示失败页面
MVCModel(M层)
- 查询账号数据
View(V层)
- Layout
实现步骤
- 将数据的获取与界面的展示分离(将查询账号数据从Activity中分离到Model中即可)
- 解决各层之间通信问题(Activity通知Mode获取数据,Model通知Activity更新界面)
结构图如下:
1.public class MVCActivity extends AppCompatActivity implements View.OnClickListener {
2. //展示查询结果
3. private TextView mTvResult;
4. //用户输入信息的输入框
5. private EditText mEtAccount;
6. private MVCModel mMvcModel;
7.
8. @Override
9. protected void onCreate(@Nullable Bundle savedInstanceState) {
10. super.onCreate(savedInstanceState);
11. setContentView(R.layout.activity_normal);
12. initView();
13. mMvcModel = new MVCModel();
14. }
15.
16. //初始化View
17. private void initView() {
18. mTvResult = findViewById(R.id.tv_result);
19. mEtAccount = findViewById(R.id.et_account);
20. findViewById(R.id.btn_getAccount).setOnClickListener(this);
21. }
22.
23. @Override
24. public void onClick(View v) {
25. mMvcModel.getAccountData(getUserInput(), new MCallBack() {
26. @Override
27. public void onSuccess(Account account) {
28. showSuccessPage(account);
29. }
30.
31. @Override
32. public void onFailed() {
33. showFailedPage();
34. }
35. });
36. }
37.
38. //获取用户输入信息
39. private String getUserInput() {
40. return mEtAccount.getText().toString();
41. }
42.
43. //展示获取数据成功的界面
44. private void showSuccessPage(Account account) {
45. mTvResult.setText("用户账号:" + account.getName() + "|"
46. + "用户等级:" + account.getLevel());
47. }
48.
49. //展示获取数据失败的界面
50. private void showFailedPage() {
51. mTvResult.setText("获取数据失败");
52. }
53.}
1.public class MVCModel {
2. //模拟查询账号数据
3. public void getAccountData(String accountName, MCallBack callBack) {
4. Random random = new Random();
5. boolean isSuccess = random.nextBoolean();
6. if (isSuccess) {
7. Account account = new Account();
8. account.setName(accountName);
9. account.setLevel(100);
10. callBack.onSuccess(account);
11. } else {
12. callBack.onFailed();
13. }
14. }
}