目前MVP应该是android开发中应用最多的框架了。
项目目录结构为:
VIew层:主要显示ui界面与用户进行交互,声明presenter对象,并等待presenter回传结果,更新ui。
Presenter层:声明model对象并等待model回传,通过接口方式将结果回传到view层。
Model层:传递presenter接口对象,实现数据处理,并将结构回传到presenter。
代码如下:
View层:
package com.example.administrator.mvc_mvp_mvvm.MVC.View;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.example.administrator.mvc_mvp_mvvm.MVC.Presenter.OkhttpImpl;
import com.example.administrator.mvc_mvp_mvvm.MVC.Presenter.OkhttpPresenter;
import com.example.administrator.mvc_mvp_mvvm.R;
public class MainActivity extends Activity implements MainPre {
private Button button;
private ImageView imageView;
private final static String URL_IMAGE = “https://www.baidu.com/img/bd_logo1.png“;
private OkhttpPresenter okhttp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
imageView = findViewById(R.id.image);
okhttp = new OkhttpImpl(MainActivity.this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
okhttp.getImage(URL_IMAGE);
}
});
}
@Override
public void updateUI(final Bitmap bitmap) {
//接收presenter的回传
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
}
}
VIew接口:
package com.example.administrator.mvc_mvp_mvvm.MVC.View;
import android.graphics.Bitmap;
public interface MainPre {
void updateUI(Bitmap bitmap);
}
Presenter层:
package com.example.administrator.mvc_mvp_mvvm.MVC.Presenter;
import android.content.Context;
import android.graphics.Bitmap;
import com.example.administrator.mvc_mvp_mvvm.MVC.Model.OkhttpMod;
import com.example.administrator.mvc_mvp_mvvm.MVC.Model.OkhttpModPre;
import com.example.administrator.mvc_mvp_mvvm.MVC.View.MainPre;
public class OkhttpImpl implements OkhttpPresenter {
private MainPre mainPre;//实现View回传接口
private OkhttpModPre okhttpModPre;//实现model接口
public OkhttpImpl(MainPre mainPre){
this.mainPre = mainPre;
okhttpModPre = new OkhttpMod();
}
public void getImage(String url){
//到Moldel层处理数据
okhttpModPre.getImageUrl(url,this);
}
@Override
public void getImageBit(Bitmap bitmap) {
//接收Model层的回传值
if(null != mainPre){
mainPre.updateUI(bitmap);
}
}
}
Presenter接口:
package com.example.administrator.mvc_mvp_mvvm.MVC.Presenter;
import android.graphics.Bitmap;
public interface OkhttpPresenter {
void getImage(String url);
void getImageBit(Bitmap bitmap);
}
Model层:
package com.example.administrator.mvc_mvp_mvvm.MVC.Model;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import com.example.administrator.mvc_mvp_mvvm.MVC.Presenter.OkhttpPresenter;
import java.io.IOException;
import java.io.InputStream;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkhttpMod implements OkhttpModPre {
private Bitmap bitmap;
public OkhttpMod(){
}
@Override
public void getImageUrl(String url, final OkhttpPresenter okhttpPresenter) {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream inputStream = response.body().byteStream();
//通过接口将结果传递给presenter
bitmap = BitmapFactory.decodeStream(inputStream);
if(null != okhttpPresenter) {
okhttpPresenter.getImageBit(bitmap);
}
}
});
}
}
Model接口:
package com.example.administrator.mvc_mvp_mvvm.MVC.Model;
import com.example.administrator.mvc_mvp_mvvm.MVC.Presenter.OkhttpPresenter;
public interface OkhttpModPre {
void getImageUrl(String url, OkhttpPresenter okhttpPresenter);
}