首先MVP是一款由MVC演化而来的 废话不多说直接上代码~
这里我没有抽基类
首先建一个MyCallBack
这里面是泛型 进行赋值
public interface CallBack<T> {
void setData(T user);
void error(T error);
}
然后建一个View层,用来存取成功或异常
public interface IView<T> {
void success(T data);
void error(T error);
}
继续Mmodel层
获取数据
public interface Model {
void getData(String url, String name, String password, CallBack callBack);
}
然后去实现这个接口
里面去写一些逻辑的一些东西,切记里面是纯Java代码
里面我用的handler
public class ModelImp implements Model {
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
try {
String JsonStr = (String) msg.obj;
Gson gson = new Gson();
JSONObject object = new JSONObject(JsonStr);
String data = object.optString("data");
if (data != null) {
User user = new User();
user.setCode(object.optString("code"));
user.setMsg(object.optString("msg"));
callBack.setData(user);
} else {
User user = gson.fromJson(JsonStr, User.class);
callBack.setData(user);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
private CallBack callBack;
@Override
public void getData(final String url, final String mobile, final String password, CallBack callBack) {
this.callBack=callBack;
new Thread(new Runnable() {
@Override
public void run() {
try {
String jsonstr = HttpUtils.post(url, mobile, password);
mHandler.sendMessage(mHandler.obtainMessage(0, jsonstr));
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
继续然后是P层
P层的作用是吧V层和M层连在一起
void startRequest(String url,String mobile,String password);
继续实现接口、
public class PresenterImp implements Presenter {
private ModelImp modelImp;
private IView iView;
public PresenterImp(IView iView) {
this.iView = iView;
modelImp = new ModelImp();
}
@Override
public void startRequest(String url, String mobile, String password) {
modelImp.getData(url, mobile, password, new CallBack() {
@Override
public void setData(Object user) {
iView.success(user);
}
@Override
public void error(Object error) {
iView.error(error);
}
});
}
}
在这给大家分享一个网络工具类
里面含有"Get"post"两种数据请求
/**
* 网络处理工具类
*/
public class HttpUtils {
public static String get(String urlStr) throws Exception {
URL url = new URL(urlStr);
//由一个有效的网址服务返回这个对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//设置请求方式
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
InputStream stream = connection.getInputStream();
String inputStr = getInputStr(stream);
return inputStr;
}
//把流转成字符串
private static String getInputStr(InputStream stream) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
StringBuffer sb = new StringBuffer();
String str = null;
while ((str = br.readLine()) != null) {
sb.append(str);
}
return sb.toString();
}
public static String post(String urlStr, String mobile, String pass) throws Exception {
String inputStr = "";
URL url = new URL(urlStr);
//由一个有效的网址服务返回这个对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//设置请求方式
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setConnectTimeout(5000);
OutputStream outputStream = connection.getOutputStream();
String params = "mobile=" + mobile + "&password=" + pass;
outputStream.write(params.getBytes());
if (connection.getResponseCode() == 200) {
InputStream stream = connection.getInputStream();
inputStr = getInputStr(stream);
}
return inputStr;
}
}
然后就是MainActivty~
public class MainActivity extends AppCompatActivity implements IView ,View.OnClickListener {
private PresenterImp presenterImp;
private EditText mName;
private EditText mPassword;
private String mUrl = "http://120.27.23.105/user/login?";
private Button login, zhuce;
private SharedPreferences sp;
private CheckBox jizhu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
sp = getSharedPreferences("login",MODE_PRIVATE);
presenterImp=new PresenterImp(this);
mName = findViewById(R.id.name);
mPassword = findViewById(R.id.password);
login = findViewById(R.id.login);
zhuce = findViewById(R.id.zhuce);
login.setOnClickListener(this);
zhuce.setOnClickListener(this);
jizhu = (CheckBox) findViewById(R.id.jizhu);
if (sp.getString("name","")!=null){
String name = sp.getString("name", "");
String pass = sp.getString("pass", "");
boolean ji = sp.getBoolean("jizhu", false);
mName.setText(name);
mPassword.setText(pass);
jizhu.setChecked(ji);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.login:
String mobile = mName.getText().toString().trim();
String pass = mPassword.getText().toString().trim();
if (mobile.isEmpty() || pass.isEmpty()) {
Toast.makeText(this, "账号和密码都不能为空", Toast.LENGTH_SHORT).show();
return;
} else {
presenterImp.startRequest(mUrl, mobile, pass);
}
break;
case R.id.zhuce:
startActivity(new Intent(this, TwoActivity.class));
break;
}
}
@Override
public void success(Object data) {
User user = (User) data;
if (user.getCode().equals("1")) {
Toast.makeText(this, user.getMsg(), Toast.LENGTH_SHORT).show();
} else {
if (jizhu.isChecked()){
String mobile = mName.getText().toString().trim();
String pass = mPassword.getText().toString().trim();
SharedPreferences.Editor edit = sp.edit();
edit.putString("name",mobile);
edit.putString("pass",pass);
edit.putBoolean("jizhu",true);
edit.commit();
}else {
SharedPreferences.Editor edit = sp.edit();
edit.clear();
edit.commit();
}
Toast.makeText(this, user.getMsg(), Toast.LENGTH_SHORT).show();
startActivity(new Intent(this, ThereActivity.class));
finish();
}
}
@Override
public void error(Object error) {
String e = (String) error;
Toast.makeText(this, e, Toast.LENGTH_SHORT).show();
}
}
布局的话就是简单的布局自己随便敲一下就OK了