MVP登录和注册页面Activity类 生成二维码 异常捕获类

1.分包效果
在这里插入图片描述
bean包:json格式转成java代码

MVP

model层:loginModel
package com.jia.logindemo.model;

import com.google.common.io.CharStreams;
import com.google.gson.Gson;
import com.jia.logindemo.HttpCallBack;
import com.jia.logindemo.bean.JsonBean;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class LoginModel {
public void login(String phone, String password, final HttpCallBack httpCallBack){
//获取网址
    final String data = "http://www.zhaoapi.cn/user/login";
    //子线程解析
    new Thread(){
        @Override
        public void run() {
            super.run();
            try {
                URL url = new URL(data);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(3000);
                int code = connection.getResponseCode();
                if(code == HttpURLConnection.HTTP_OK){
                    InputStream inputStream = connection.getInputStream();
                    String s = CharStreams.toString(new InputStreamReader(inputStream, "UTF-8"));
                    Gson gson = new Gson();
                    JsonBean jsonBean = gson.fromJson(s,JsonBean.class);
                   //getCode是json数据里的数据(成功返回code)  msg同理
                    if(jsonBean.getCode() == 0){
                        httpCallBack.onSuccess(jsonBean.getData());
                    }else{
                        httpCallBack.onFailer(jsonBean.getMsg());
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }.start();
    try {
        Thread.sleep(3000);
        //写死数据
        if(phone.equals("aaaaaa")&&password.equals("123456")){
            httpCallBack.onSuccess("登陆成功");
        }else{
            httpCallBack.onFailer("登陆失败");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}
Presenter层LoginPresenter
package com.jia.logindemo.presenter;

import com.jia.logindemo.HttpCallBack;
import com.jia.logindemo.model.LoginModel;
import com.jia.logindemo.view.LoginView;

public class LoginPresenter {
private LoginView loginView;
private LoginModel loginModel;

public LoginPresenter(LoginView loginView) {
    this.loginView = loginView;
    loginModel = new LoginModel();
}
public void login(String phone,String password){
    loginModel.login(phone, password, new HttpCallBack() {
        @Override
        public void onSuccess(String result) {
            loginView.onSuccess(result);
        }

        @Override
        public void onFailer(String msg) {
            loginView.onFailer(msg);
        }
    });
}

}
HttpCallBack接口
package com.jia.logindemo;

public interface HttpCallBack {
//返回成功或失败
void onSuccess(String result);
void onFailer(String msg);
}

View层 LoginView
package com.jia.logindemo.view;

public interface LoginView {
void onSuccess(String result);
void onFailer(String msg);
}
LoginActivity
package com.jia.logindemo;

import android.content.Context;
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.jia.logindemo.presenter.LoginPresenter;
import com.jia.logindemo.view.LoginView;
//实现LoginView会实现LoginView里面所有的方法
public class LoginActivity extends AppCompatActivity implements LoginView {

private EditText login_number;
private EditText login_password;
private Button login;
private Button register;
private LoginPresenter loginPresenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    initView();
    initListener();
    //实例化LoginPresenter
    loginPresenter = new LoginPresenter(this);
}

private void initListener() {
    login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String phonenumber = login_number.getText().toString().trim();
            String password = login_password.getText().toString().trim();
            //调用loginPresenter
            loginPresenter.login(phonenumber,password);
        }
    });
    register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(LoginActivity.this,RegisterActivity.class);
            startActivity(intent);
        }
    });
}

private void initView() {
    login_number = findViewById(R.id.login_number);
    login_password = findViewById(R.id.login_password);
    login = findViewById(R.id.login);
    register = findViewById(R.id.register);
}
//LoginView里面的方法
@Override
public void onSuccess(String result) {
	//登陆成功会保存数据 第二次直接进入
    SharedPreferences sharedPreferences = getSharedPreferences(Constant.APP_CONFIG, Context.MODE_PRIVATE);
    SharedPreferences.Editor edit = sharedPreferences.edit();
    edit.putBoolean(Constant.IS_LOGIN,true);
    edit.commit();
    Intent intent = new Intent(this,MainActivity.class);
    startActivity(intent);
    finish();
}

@Override
public void onFailer(String msg) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(LoginActivity.this,"登录失败",Toast.LENGTH_SHORT).show();
        }
    });
}

}

在这里插入图片描述

注册与登陆一样 CV改名字改网址

生成二维码

build.grade文件中添加依赖
implementation ‘cn.bingoogolapple:bga-qrcode-zxing:1.3.4’

Java代码
package com.jia.logindemo;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.AsyncTask;
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.ImageView;
import android.widget.Toast;

import cn.bingoogolapple.qrcode.core.BGAQRCodeUtil;
import cn.bingoogolapple.qrcode.core.QRCodeView;
import cn.bingoogolapple.qrcode.zxing.QRCodeEncoder;
//添加依赖后实现QRCodeView.Delegate
public class MainActivity extends AppCompatActivity implements QRCodeView.Delegate {

private EditText erweima;
private Button bt_click;
private ImageView ivImage;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    bt_click.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onCreateQRCode();
        }
    });
}

private void onCreateQRCode() {
	//子线程生成二维码
    new AsyncTask<String, Integer, Bitmap>() {
        @Override
        protected Bitmap doInBackground(String... strings) {
            String QRCode = erweima.getText().toString().trim();
            //获取要生成的二维码中间的LOGO
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
            return QRCodeEncoder.syncEncodeQRCode(QRCode,BGAQRCodeUtil.dp2px(MainActivity.this,150),Color.BLACK,bitmap);
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if(bitmap!=null){
                ivImage.setImageBitmap(bitmap);
            }else{
                Toast.makeText(MainActivity.this,"生成二维码失败",Toast.LENGTH_SHORT).show();
            }
        }
    }.execute();
}

private void initView() {
    erweima = findViewById(R.id.erweima);
    bt_click = findViewById(R.id.bt_click);
    ivImage = findViewById(R.id.ivImage);
}

@Override
public void onScanQRCodeSuccess(String result) {

}

@Override
public void onCameraAmbientBrightnessChanged(boolean isDark) {

}

@Override
public void onScanQRCodeOpenCameraError() {

}

}

自定义全部异常捕获类

自定义异常捕获类
package com.jia.logindemo;

import android.content.Context;
import android.os.Process;
import android.util.Log;

public class UnCatchExceptionHandler implements Thread.UncaughtExceptionHandler {

private Context context;
private Thread.UncaughtExceptionHandler exceptionHandler;//系统的默认异常处理类
private static  UnCatchExceptionHandler instance = new UnCatchExceptionHandler();//用户自定义的异常处理类
private UnCatchExceptionHandler(){}
public static UnCatchExceptionHandler getInstance(){
    return instance;
};
public void init(Context context){
    this.context = context.getApplicationContext();
    exceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread t, Throwable e) {
   //打log判断一下是否收集到异常
    Log.d("-----------",e.toString());
    //如果系统提供了异常处理类,则交给系统去处理
    if(exceptionHandler!=null){
        exceptionHandler.uncaughtException(t,e);
    }else {
        Process.killProcess(Process.myPid());
    }
}

}
新建一个类继承Application

package com.jia.logindemo;

import android.app.Application;

import com.tencent.bugly.crashreport.CrashReport;

public class GenAndApplication extends Application {

@Override
public void onCreate() {
    super.onCreate();
    //使用自定义全局异常捕获类
    UnCatchExceptionHandler.getInstance().init(this);
}

}

把异常提交到bugly
接上面

public class GenAndApplication extends Application {

@Override
public void onCreate() {
    super.onCreate();
    UnCatchExceptionHandler.getInstance().init(this);     
    CrashReport.initCrashReport(getApplicationContext(),"ec2de502e2",true);
}

}

ec2de502e2是提交到bugly后自动生成的 然后CV到代码里

清单文件中添加
<uses-permission android:name=“android.permission.READ_PHONE_STATE” /
<uses-permission android:name=“android.permission.INTERNET” /
<uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE” /
<uses-permission android:name=“android.permission.ACCESS_WIFI_STATE” /
<uses-permission android:name=“android.permission.READ_LOGS”/
tools:ignore=“ProtectedPermissions” /
在这里插入图片描述

build.grade中添加
implementation ‘com.tencent.bugly:crashreport:latest.release’
//其中latest.release指代最新Bugly SDK版本号,也可以指定明确的版本号,例如2.1.9
implementation ‘com.tencent.bugly:nativecrashreport:latest.release’
//其中latest.release指代最新Bugly NDK版本号,也可以指定明确的版本号,例如3.0

在这里插入图片描述

添加ndk
ndk { abiFilters ‘armeabi’,‘x86’,‘armeabi-v7a’,‘x86_64’,‘arm64-v8a’ }
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值