Android MVP设计架构:Model层数据传递到View层

36 阅读3分钟

@Override

public Object request(String s, final Callback callback) {

CompletableFuture.runAsync(new Runnable() {

@Override

public void run() {

for (int i = 0; i <= 100; i++) {

SystemClock.sleep(100);

if (callback != null)

callback.call(i);

}

}

});

return null;

}

}

package zhangphil.demo;

public interface LoadView extends View {

void status(T t);

}

package zhangphil.demo;

public class LoadPresenter implements Presenter {

private LoadView view;

private Model model;

public LoadPresenter(LoadView view) {

this.view = view;

model = new LoadModel(this);

}

@Override

public void action(String s) {

model.request(s, new Callback<Integer, Object>() {

@Override

public Object call(Integer i) {

updateProgress(i);

return null;

}

});

}

@Override

public void progress(int i) {

}

private void updateProgress(int i) {

view.progress(i);

if (i > 0 && i < 100) {

view.status("下载中...");

}

if (i == 100) {

view.status("下载完成");

}

}

}

测试:

package zhangphil.demo;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements LoadView {

private TextView progress,status;

private Button button;

private Presenter presenter;

private AppCompatActivity activity;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

activity = this;

setContentView(R.layout.activity_main);

progress = findViewById(R.id.progress);

button = findViewById(R.id.button);

status=findViewById(R.id.status);

presenter = new LoadPresenter(this);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

presenter.action("zhangphil.blog.csdn.net/");

}

});

}

@Override

public void status(final String s) {

activity.runOnUiThread(new Runnable() {

@Override

public void run() {

status.setText(s);

}

});

}

@Override

public void progress(final Integer i) {

activity.runOnUiThread(new Runnable() {

@Override

public void run() {

progress.setText(i + " %");

}

});

}

}

另外一种方案,不使用Callback回调,直接在Model层调用Presenter层预设的更新函数,在此函数里面进一步触发View的更新,如:

package zhangphil.demo;

public interface Model<T, R> {

R request(T t);

}

package zhangphil.demo;

public interface View {

void progress(T t);

}

package zhangphil.demo;

public interface Presenter {

void action(T t);

void progress(int i);

}

框架模型实现:

package zhangphil.demo;

import android.os.SystemClock;

import java.util.concurrent.CompletableFuture;

public class LoadModel implements Model<String, Object> {

private Presenter presenter;

public LoadModel(Presenter presenter) {

this.presenter = presenter;

}

/**

  • 模拟下载。

  • @param s

  • @return

*/

@Override

public Object request(String s) {

CompletableFuture.runAsync(new Runnable() {

@Override

public void run() {

for (int i = 0; i <= 100; i++) {

SystemClock.sleep(100);

presenter.progress(i);

}

}

});

return null;

}

}

package zhangphil.demo;

public interface LoadView extends View {

void status(T t);

}

package zhangphil.demo;

public class LoadPresenter implements Presenter {

private LoadView view;

private Model model;

public LoadPresenter(LoadView view) {

this.view = view;

model = new LoadModel(this);

}

@Override

public void action(String s) {

model.request(s);

}

@Override

public void progress(int i) {

updateProgress(i);

}

private void updateProgress(int i) {

view.progress(i);

if (i > 0 && i < 100) {

view.status("下载中...");

}

if (i == 100) {

view.status("下载完成");

}

}

}

测试:

package zhangphil.demo;

import android.support.v7.app.AppCompatActivity;

分享读者

作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。

被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!

我们整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。如果你有需要,尽管拿走好了。

腾讯T3架构师学习专题资料

如果你觉得自己学习效率低,缺乏正确的指导,可以点击加入资源丰富,学习氛围浓厚的技术圈一起学习交流吧

群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。