上一篇文章应用了最简单的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
    }

下篇再会,小伙伴们。

 

 

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐