基类抽取
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>
以上