我的MVP自学笔记2:复用Presenter,实现优美的发送和解析
上一篇文章应用了最简单的MVP架构,不过仍然有诸多的不足,例如Presenter复用不高,绑定解绑不够明确,View和P层耦合度较高,代码可读性低等问题。这一篇将治理于解决以上问题,用于实践积累。话不多说,先描述下本篇实现的功能:使用MVP完成简易的Okhttp post请求,合理运用Model 完成Post的ResponseBody封装,从可读性角度使用Lambda表达式。下面到了大家最喜爱..
上一篇文章应用了最简单的MVP架构,不过仍然有诸多的不足,例如Presenter复用不高,绑定解绑不够明确,View和P层耦合度较高,代码可读性低等问题。这一篇将治理于解决以上问题,用于实践积累。
话不多说,先描述下本篇实现的功能:使用MVP完成简易的Okhttp post请求,合理运用Model 完成Post的ResponseBody封装,从可读性角度使用Lambda表达式。下面到了大家最喜爱的上代码环节:
P层:
public class FifthBasePresenter<V> {
private V mView;
public void attachView(V view){
mView = view;
}
public void detachView(){
if (mView != null)
mView = null;
}
public V getView(){
return this.mView;
}
}
注意string()和toString()的区别,利用Gson将对象转为Json格式的字符串,然后封装为RequestBody对象
public class FifthPresenter extends FifthBasePresenter<FifthView> {
public void getIpInfo(String url,IPResponse ipResponse){
OkHttpClient mOkHttpClient = new OkHttpClient();
String route = new Gson().toJson(ipResponse);
RequestBody body=RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),route);
Request request = new Request.Builder().url(url).post(body).build();
Call call = mOkHttpClient.newCall(request);
try {
Response execute = call.execute();
boolean successful = execute.isSuccessful();
if (successful){
getView().responseResultOk(execute.body().string());
// body.string() 返回的是字符串
// body.toString() 返回的是对象
//getView().responseResultOk(execute.body().toString());
}else {
getView().responseResultOk("请求失败!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
M层
用于存储数据的Bean,将来还包括返回的值的Bean
public class IPResponse {
private String format;
private String ip;
public IPResponse(String format, String ip) {
this.format = format;
this.ip = ip;
}
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
View层
就是要操作的对象啦,等后面用rxjava的话就可以返回View对象啦,这里只能说通过str传值在activity传,因为得在主线程中更新UI嘛
public interface FifthView {
void responseResultOk(String str);
void responseResultFailure(String err);
}
Activity
小伙伴们是不是觉得,下面 -> 很难看懂啊,其实小白我也是,这是lambda表达式,我目前是不会写的,是编译器提示生成的,先看看咋写的,能看懂就好啦。alt+enter 即可生成Lambda又可还原哦。后面给出lambda的引入。
public class FifthActivity extends AppCompatActivity implements FifthView {
private Button mBtn_request_ip;
private TextView mTv_result;
private FifthPresenter mFifthPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fifth);
initViews();
initListeners();
mFifthPresenter = new FifthPresenter();
mFifthPresenter.attachView(this);
}
private void initListeners() {
mBtn_request_ip.setOnClickListener(view -> new Thread(() -> mFifthPresenter.getIpInfo
("http://int.dpool.sina.com.cn/iplookup/iplookup.php",
new IPResponse("json", "218.4.255.255"))).start());
}
private void initViews() {
mBtn_request_ip =(Button) findViewById(R.id.btn_request_ip);
mTv_result = (TextView)findViewById(R.id.tv_result);
}
@Override
protected void onDestroy() {
super.onDestroy();
mFifthPresenter.detachView();
}
@Override
public void responseResultOk(String str) {
runOnUiThread(() -> mTv_result.setText(str));
}
@Override
public void responseResultFailure(String err) {
runOnUiThread(() -> mTv_result.setText(err));
}
}
配置Lambda
project.gradle
dependencies {
// 这个可能和你的不一样哦
classpath 'com.android.tools.build:gradle:3.0.1'
// 引入lambda
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
}
app.gradle
注意和buildTypes并列哦,说明一下buildTypes是配置是否混淆和配置默认的debug包的。
compileOptions是配置Java的运行环境的,lanbda得jdk1.8以上才支持哦,不知道为啥AS默认好像是1.7我也不太清楚啦啦啊啊
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
下篇再会,小伙伴们。
更多推荐


所有评论(0)