Android : MVP登陆

基类抽取

package com.bigfly.administrator.myapplication2.base;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public abstract class MyBaseActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
    }

    //布局文件
    protected abstract int getLayout();

    //初始化控件
    protected abstract void initViews();

    //注册监听
    protected abstract void setOnclick();

    //进行页面逻辑处理
    protected abstract void processLogic();

    //设定好执行方法的流程
    void init() {
        //进行判断布局文件是否为空
        if (getLayout() != 0) {
            setContentView(getLayout());
            initViews();
            setOnclick();
            processLogic();
        } else {
            //如果为空则将抛出异常
            throw new IllegalStateException("请加载布局文件");
        }
    }

    ;
}

回调数据接口

package com.bigfly.administrator.myapplication2.callback;

//泛型
public interface MyCallBack<T> {
    //成功时回调接口数据
    void setData(T user);

    //失败是回调数据接口
    void seterror(T error);
}

v层

package com.bigfly.administrator.myapplication2.iview;

//将V层的界面做一个接口
public interface IView<T> {
    void success(T data);

    void error(T error);

}

modle的接口

package com.bigfly.administrator.myapplication2.moudle;

import android.content.Context;

import com.bigfly.administrator.myapplication2.callback.MyCallBack;

public interface Moudle {
    //将moudle进行抽取接口.
    void getData(String url, String username, String userpwd, MyCallBack callBack);

}

modle的实现类

package com.bigfly.administrator.myapplication2.moudle;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import com.bigfly.administrator.myapplication2.bean.MyData;
import com.bigfly.administrator.myapplication2.callback.MyCallBack;
import com.bigfly.administrator.myapplication2.util.MyHttpUtil;
import com.google.gson.Gson;

import org.json.JSONException;
import org.json.JSONObject;

//moudle的实现类
public class MoudleImpl implements Moudle {
    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            //进行和获取
            String jsons = (String) msg.obj;
            Gson gson = new Gson();
            JSONObject Object = null;
            try {
                Object = new JSONObject(jsons);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            String data = Object.optString("data");
            //进行判断
            if (data != null) {
                //创建一个实体类
                MyData datas = new MyData();
                datas.setCode(Object.optString("code"));
                datas.setMsg(Object.optString("msg"));
                callBack.setData(datas);
            } else {
                //解析数据
                MyData datas = gson.fromJson(jsons, MyData.class);
                callBack.setData(datas);
            }
        }
    };
    private MyCallBack callBack;

    @Override
    public void getData(final String url, final String mobile, final String userpwd, final MyCallBack callBack) {
        //进行参数回调
        this.callBack = callBack;
        //开启子线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                //进行一个抛异常
                try {
                    //进行数据解析
                    String jsons = MyHttpUtil.post(url, mobile, userpwd);
                    //在handler里面进行解析
                    handler.sendMessage(handler.obtainMessage(0, jsons));
                } catch (Exception e) {
                    Looper.prepare();
                    callBack.seterror("出现了异常");
                    Looper.loop();
                }
            }
        }).start();
    }
}

p层的接口

package com.bigfly.administrator.myapplication2.presenter;

public interface Persenters {
    //将P层的接口写出来
    void startRequest(String url, String mobile, String password);
}

p层的实现类

package com.bigfly.administrator.myapplication2.presenter;


import com.bigfly.administrator.myapplication2.callback.MyCallBack;
import com.bigfly.administrator.myapplication2.iview.IView;
import com.bigfly.administrator.myapplication2.moudle.MoudleImpl;

//P层的实现类
public class PersenterImpl implements Persenters {
    private MoudleImpl moudle;
    private IView iView;

    public PersenterImpl(IView iView) {
        this.iView = iView;
        moudle = new MoudleImpl();
    }

    @Override
    public void startRequest(final String url, String mobile, String password) {
        moudle.getData(url, mobile, password, new MyCallBack() {
            @Override
            public void setData(Object user) {
                iView.success(user);
            }

            @Override
            public void seterror(Object error) {
                iView.error(error);
            }
        });
    }

    //防止内存泄漏
    public void onDetatch() {
        if (moudle != null) {
            moudle = null;
        }
        if (iView != null) {
            iView = null;
        }
    }

}

注册的activity

package com.bigfly.administrator.myapplication2.ui;

import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.bigfly.administrator.myapplication2.R;
import com.bigfly.administrator.myapplication2.base.MyBaseActivity;
import com.bigfly.administrator.myapplication2.bean.MyData;
import com.bigfly.administrator.myapplication2.iview.IView;
import com.bigfly.administrator.myapplication2.presenter.PersenterImpl;

public class RegisterActivity<T> extends MyBaseActivity implements IView<T> {
    private PersenterImpl presenter;
    private EditText mMobile, mPassWord;
    private Button mRegister;
    private String mUrl = "http://120.27.23.105/user/reg";

    @Override
    protected int getLayout() {
        return R.layout.register_layout;
    }

    @Override
    protected void initViews() {
        mMobile = findViewById(R.id.Name);
        mPassWord = findViewById(R.id.Pwd);
        mRegister = findViewById(R.id.My_Register);
    }

    @Override
    protected void setOnclick() {
        mRegister.setOnClickListener(this);
    }

    @Override
    protected void processLogic() {
        presenter = new PersenterImpl(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.My_Register:
                //对文本框进行取值
                String mobile = mMobile.getText().toString().trim();
                String pass = mPassWord.getText().toString().trim();
                //进行判断
                if (mobile.isEmpty() || pass.isEmpty()) {
                    //如果有为空的进行吐司提示
                    Toast.makeText(this, "账号或密码不能为空", Toast.LENGTH_SHORT).show();
                    //将数值进行返回
                    return;
                } else {
                    //如果判断不为空,那么进行跳转
                    presenter.startRequest(mUrl, mobile, pass);
                }
                break;
        }
    }

    @Override
    public void success(Object data) {
        //获取网络接口中的值
        MyData myData = (MyData) data;
        //进行判断    网络接口值为1
        if (myData.getCode().equals("1")) {
            Toast.makeText(this, myData.getMsg(), Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, myData.getMsg(), Toast.LENGTH_SHORT).show();
            finish();
        }
    }

    @Override
    public void error(T error) {
        Toast.makeText(this, error.toString() + "失败", Toast.LENGTH_SHORT).show();
    }
}

主页的activity

package com.bigfly.administrator.myapplication2.ui;

import android.content.Intent;
import android.content.SharedPreferences;
import android.view.View;
import android.widget.Button;

import com.bigfly.administrator.myapplication2.MainActivity;
import com.bigfly.administrator.myapplication2.R;
import com.bigfly.administrator.myapplication2.base.MyBaseActivity;

public class HomeActivity extends MyBaseActivity {
    private Button mExit;
    private SharedPreferences mShare;
    private SharedPreferences.Editor mEditor;

    @Override
    protected int getLayout() {
        return R.layout.home_layout;
    }

    @Override
    protected void initViews() {
        //查找控件
        mExit = findViewById(R.id.My_Exit);
    }

    @Override
    protected void setOnclick() {
        mExit.setOnClickListener(this);
    }

    @Override
    protected void processLogic() {
        //本地保存信息
        mShare = getSharedPreferences("lf", MODE_PRIVATE);
        mEditor = mShare.edit();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.My_Exit:
                mEditor.clear();
                mEditor.commit();
                startActivity(new Intent(this, MainActivity.class));
                finish();
                break;
        }
    }
}

网络解析工具类

package com.bigfly.administrator.myapplication2.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MyHttpUtil {
    //get传递数据
    public static String get(String mUrl) {
        try {
            URL url = new URL(mUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5000);
            InputStream stream = connection.getInputStream();
            String jsons = getStream(stream);
            return jsons;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String post(String urlStr, String moblie, String pass) {
        String inputStr = "";
        try {
            //由一个有效的网址服务,返回这个对象
            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=" + moblie + "&password=" + pass;
            outputStream.write(params.getBytes());
            //进行一个判断,是否成功请求道网络
            if (connection.getResponseCode() == 200) {
                InputStream stream = connection.getInputStream();
                inputStr = getStream(stream);
            }
            return inputStr;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    private static String getStream(InputStream stream) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        StringBuffer sb = new StringBuffer();
        String con;
        while ((con = reader.readLine()) != null) {
            sb.append(con);
        }
        reader.close();
        return sb.toString();
    }
}

mainactivity的代码

扫描二维码关注公众号,回复: 4576254 查看本文章
package com.bigfly.administrator.myapplication2;

import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.bigfly.administrator.myapplication2.base.MyBaseActivity;
import com.bigfly.administrator.myapplication2.bean.MyData;
import com.bigfly.administrator.myapplication2.iview.IView;
import com.bigfly.administrator.myapplication2.presenter.PersenterImpl;
import com.bigfly.administrator.myapplication2.ui.HomeActivity;
import com.bigfly.administrator.myapplication2.ui.RegisterActivity;

public class MainActivity<T> extends MyBaseActivity implements IView<T> {
    /**
     * * {"msg":"注册成功","code":"0"}
     * * {"msg":"请输入正确的手机号码","code":"1","data":"{}"}
     * * {"msg":"天呢!用户已注册","code":"1","data":"{}"}
     */
    //这个TT为什么 这么写  必须要字本来声明实现或者继承才能调用到
    private PersenterImpl presenter;
    private EditText mMobile, mPassWord;
    private Button mLogin, mRegister;
    private String mUrl = "http://120.27.23.105/user/login";
    private SharedPreferences mShared;
    private boolean isLogin;
    private SharedPreferences.Editor mEditor;

    @Override
    protected int getLayout() {
        return R.layout.activity_main;
    }

    @Override
    protected void initViews() {
        mMobile = findViewById(R.id.User_name);
        mPassWord = findViewById(R.id.User_pass);
        mLogin = findViewById(R.id.My_Login);
        mRegister = findViewById(R.id.My_zhuce);
    }

    @Override
    protected void setOnclick() {
        mLogin.setOnClickListener(this);
        mRegister.setOnClickListener(this);
    }

    @Override
    protected void processLogic() {
        mShared = getSharedPreferences("lf", MODE_PRIVATE);
        mEditor = mShared.edit();
        isLogin = mShared.getBoolean("isLogin", false);
        //进行判断
        if (isLogin) {

            startActivity(new Intent(this, HomeActivity.class));
            finish();
        }
        presenter = new PersenterImpl(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.My_Login:
                //进行取值
                String mobile = mMobile.getText().toString().trim();
                String pass = mPassWord.getText().toString().trim();
                //进行判断
                if (mobile.isEmpty() || pass.isEmpty()) {
                    //如果有为空的进行吐司提示
                    Toast.makeText(this, "账号或密码不能为空", Toast.LENGTH_SHORT).show();
                    //将数值进行返回
                    return;
                } else {
                    //如果判断不为空,那么进行跳转
                    presenter.startRequest(mUrl, mobile, pass);
                }
                break;
            case R.id.My_zhuce:
                //启动跳转
                startActivity(new Intent(this, RegisterActivity.class));
                break;
        }
    }

    @Override
    public void success(T data) {
        //获取网络接口中的值
        MyData myData = (MyData) data;
        //进行判断    网络接口值为1
        if (myData.getCode().equals("1")) {
            Toast.makeText(this, myData.getMsg(), Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, myData.getMsg(), Toast.LENGTH_SHORT).show();
            //登陆启动跳转
            startActivity(new Intent(this, HomeActivity.class));
            //登录完毕后进行销毁
            finish();
            //将输入的数据进行本地保存
            mEditor.putBoolean("isLogin", true);
            mEditor.commit();
        }
    }

    @Override
    public void error(T error) {
        String e = (String) error;
        Toast.makeText(this, e, Toast.LENGTH_SHORT).show();

    }
}

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#36eff9"
        android:gravity="center"
        android:padding="8dp"
        android:text="登陆"
        android:textSize="22sp" />

    <EditText
        android:id="@+id/User_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="6dp"
        android:hint="请输入账号" />

    <EditText
        android:id="@+id/User_pass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="6dp"
        android:hint="请输入密码"
        android:inputType="numberPassword" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/My_Login"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="登陆" />

        <Button
            android:id="@+id/My_zhuce"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="注册" />
    </LinearLayout>
</LinearLayout>

z主页的xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="成功登录哦"
        android:textSize="32dp" />

    <Button
        android:id="@+id/My_Exit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="退出登录" />

</LinearLayout>

注册的xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#36eff9"
        android:gravity="center"
        android:padding="8dp"
        android:text="注册"
        android:textSize="22sp" />

    <EditText
        android:id="@+id/Name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="6dp"
        android:hint="请输入账号" />

    <EditText
        android:id="@+id/Pwd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="6dp"
        android:hint="请输入密码"
        android:inputType="numberPassword" />

    <Button
        android:id="@+id/My_Register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="注册" />

</LinearLayout>

以上

猜你喜欢

转载自blog.csdn.net/weixin_43603192/article/details/84867332