简单的MVP登录

首先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了

猜你喜欢

转载自blog.csdn.net/qq_42775434/article/details/84931081